空原型,Object.prototype和Object.create

Dun*_*can 13 javascript prototype

为什么设置构造函数的prototype属性null不会阻止从该函数创建的对象调用方法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
Run Code Online (Sandbox Code Playgroud)

Ben*_*aum 25

简而言之

是的,你的观察是正确的 - 在这种情况下,由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.

这意味着我们可以设置它,它也明确检查,这是该算法null或对象(请不要跟随链接到规范和阅读:))

所以调用的对象的原型new FooObject.prototype和否null.如果不Object.create使用标准方法,则无法创建没有原型的对象.

  • 谢谢:很好的回答! (2认同)