簡體   English   中英

空原型、Object.prototype 和 Object.create

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM