14

为什么将构造函数的原型属性设置为null不会阻止从该函数创建的对象调用方法 on 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
4

1 回答 1

33

简而言之

的,您的观察是正确的 - 在这种情况下,使用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 或 Object(请务必点击规范的链接阅读它:))

所以用new FooisObject.prototype和 not调用的对象的原型nullObject.create如果不使用标准方法,就不可能创建没有原型的对象。

于 2013-08-12T23:29:37.733 回答