![](/img/trans.png)
[英]difference between Object.create(Object.prototype) , Object.create(Object) and Object.create(null)
[英]Null prototype, Object.prototype and Object.create
為什么將構造函數的原型屬性設置為null
不會阻止從該函數創建的對象調用Object.prototype
上的方法, Object.prototype
將原型設置為Object.create(null)
一樣?
也就是說,為什么會這樣:
function Foo(){}
Foo.prototype = null;
console.log(new Foo().toString); //outputs function toString() { [native code] } (or whatever)
function Foo(){}
Foo.prototype = Object.create(null);
console.log(new Foo().toString); //output undefined
是的,您的觀察是正確的 - 在這種情況下,使用new
運算符構造的函數將始終具有對象原型Object.prototype
,這確實與使用 Object.create 創建的函數不同。
可以在 JavaScript 所基於的 ES5 語言規范中看到完全指定的這種行為。 讓我們看看這個。
new
: 引用函數的[[Construct]]
方法的規范,該規范指示如何使用new
運算符執行對象創建,我們可以看到指定了以下內容:
如果 Type(proto) 不是 Object,則將 obj 的 [[Prototype]] 內部屬性設置為標准內置 Object 原型對象,如 15.2.4 所述。
Object.create
: 另一方面,如果我們查看Object.create
的規范,我們可以看到Object.create(o)
指定:
將 obj 的 [[Prototype]] 內部屬性設置為 O。
這意味着我們可以設置它,它也明確確認它為空或對象在算法(請跟隨鏈接到規范和閱讀:))
所以用new Foo
調用的對象的原型是Object.prototype
而不是null
。 如果沒有Object.create
只使用標准方法創建沒有原型的對象是不可能的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.