2012-07-27 71 views
2

可能重複:
How does JavaScript .prototype work?理解原型在JavaScript

從Java背景的人,我試圖理解JavaScript。

請讓我知道這些是否正確。

  1. 就像在java中,有一個最高級的對象,所有其他對象從中繼承。
  2. 原型屬性就像一個指向父對象的指針(在java中的類)
  3. 對於「Object」對象,原型爲null。
  4. 原型屬性的值是表示對象命名的字符串,並不像C中的指針。指針概念使用隱藏屬性[[PROTOTYPE]]實現,該屬性在腳本中無法訪問。

我使用node.js代替瀏覽器來學習JS。 我試過了,

var human = Object.create(null); // same as var human; 
console.log(Object.getPrototypeOf(human)); //null 

var man = Object.create(human); 
console.log(Object.getPrototypeOf(man)); 
//{} 
//expected 'human' 

var person = Object.create(Object.prototype); // same as var person = {} 
console.log(Object.getPrototypeOf(person)); 
//{} 
//expected 'object' 
+0

[這裏是一篇不錯的和詳細的文章,它可能會幫助你很多方面](http://conceptf1.blogspot.com/2013/11/javascript-prototype-property-and-Inheritance.html) – 2013-11-15 17:08:37

回答

0
  1. 是的,除了Object.create(null),它不從任何東西繼承。
  2. 不確定「父對象」是什麼,但函數的原型由實例可訪問的函數組成。因爲Object.prototype.toString存在,所以{}.toString - 它是繼承
  3. 是的,原型鏈在此結束。
  4. 不,.prototype(或Object.getPrototypeOf返回的值)是可以使用屬性擴展的對象,以便這些屬性由實例繼承。

你的例子:

var human = Object.create(null); // same as var human; 

不,它創建一個空的對象,不從任何繼承。var human; sets humanundefined - 這不是一個對象,而是一個原始值(並非所有東西都是JavaScript中的對象)。

var man = Object.create(human); 
console.log(Object.getPrototypeOf(man)); 
//{} 
//expected 'human' 

Object.getPrototypeOf(man)返回對象human。這是一個空洞的對象;節點將其顯示爲{}。它是而不是的一個字符串。事實上,對象可以分配給多個變量。一個對象沒有綁定的變量,所以設計上根本不可能獲得一個字符串。要檢查平等,您可以執行Object.getPrototypeOf(man) === human,這會產生true

var person = Object.create(Object.prototype); // same as var person = {} 
console.log(Object.getPrototypeOf(person)); 
//{} 
//expected 'object' 

這確實是相同{} - 直接從Object繼承一個空對象。如上所述,原型是Object.prototype而不是字符串。它看起來是空的,但這是因爲Object.prototype的功能默認和隱藏。

0

首先,你需要閱讀有關create方法嘗試使用它之前。

其次,調用對象以下列方式:

var human = {}, man = {}, person = {}; 

第三,這是不是Java。在Java類和對類的理解是非常重要的。原型在JavaScript中是完全可選的。原型提供的唯一性能優勢來自於代碼在不同範圍內通過引用大量重用函數。如果這種編碼方式不適用於您,那麼您可能不需要使用原型。

原型是從父項或某個祖先對象繼承的。 JavaScript解析器將首先查找本地分配,如果不存在,則將檢查當前對象的原型是否存在已命名的引用。簡而言之,在編寫JavaScript的這個早期階段你需要知道的一切。

0

首先,IMO,不要從節點開始。如果您還不知道JavaScript,節點會將您拖入一堆流沙中。其次,當我開始使用基於功能的代碼時,然後是OO,然後才轉向原型。但如果你真的想知道,這個問題已經通過here回答。隨時問我是否有任何問題!

+0

如果不是節點,你有什麼建議我使用? – John 2012-07-27 19:02:37

+0

只需使用普通的js。節點主要用於服務器端JavaScript,這是一個完整的球場。有關教程,請參見[w3schools](http://www.w3schools.com/js/default.asp) – Kpower 2012-07-28 00:40:48