2013-07-25 63 views
4

我想了解對象創建的工作方式以及使用Object.create()創建的對象的相應原型。我有以下代碼:Object.create()的默認行爲

var obj = Object.create({name: "someValue"}); 

console.log(Object.getPrototypeOf(obj)); // => Object{name: "someValue"} 

console.log(obj.constructor.prototype); // => Object{} 

// check if obj inherits from Object.prototype 
Object.prototype.isPrototypeOf(obj); // => true 

是否正確斷言的代碼的最後一行,因爲對象{name: "someValue"}本身的Object.prototype繼承返回true?有沒有更好的解釋呢?

回答

2

Object.prototype.isPrototypeOf它指出isPrototypeOf檢查鏈,而不只是父規格:

重複

  1. 令V是[[原型]]內部的屬性的值五

  2. 如果V爲null,返回false

  3. 如果O和V引用同一個對象,則返回true。

你的斷言是完全正確的。創建的原型鏈的格式爲:

obj => Object {name:"someValue"} => Object {} => null 
            /\ 
             | 
             \ -- This guy is Object.prototype 

可以通過創建使用Object.create對象和空傳遞作爲參數與代碼驗證它。

var obj = Object.create(null); 
Object.prototype.isPrototypeOf(obj); //false 

這裏,因爲我們傳遞null,而不是一個對象,它本身不具有Object.prototype中爲原型,所以我們得到false

+1

只需要注意,另一種驗證確實如此的方法是通過執行Object.getPrototypeOf(Object.getPrototypeOf(obj))=== Object.prototype'。 'Object.prototype'表示執行'new Object()'時所調用的對象的原型或更常見的直接文字符號。 –

+1

#note-to-self由於Object.getPrototypeOf()返回一個'object',所以可以使用Benjamin Gruenbaum使用的嵌套函數調用樣式。 – gabeno