Null原型,Object.prototype和Object.create

问题描述 投票:13回答:1

为什么将构造函数的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
javascript prototype
1个回答
25
投票
简而言之

是,您的观察是正确的-在这种情况下,使用new运算符构造的函数将[[总是具有对象原型,这确实不同于使用Object.create创建的函数。

为什么
人们可以看到JavaScript所基于的ES5语言规范中完全指定了这种行为。让我们看看这个。

Object.prototype中:

new函数方法的[Quoting the specification,它指示如何使用[[Construct]]运算符创建对象,我们可以看到指定了以下内容:

如果(obj.prototype的类型)不是Object,则将obj的[[Prototype]]内部属性设置为标准内置的Object原型对象,如15.2.4中所述。

new中:

另一方面,如果我们查看Object.create,则可以看到The spec for Object.create指定:

将obj的[[Prototype]]内部属性设置为O。

这意味着我们可以设置它,它还会在该算法中显式检查它是否为null或Object(请

do

跟随规范的链接并阅读它:))

因此,用Object.create调用的对象的原型是Object.create(o),而不是new Foo。仅使用标准方法,如果没有Object.prototype,就无法创建没有原型的对象。

© www.soinside.com 2019 - 2024. All rights reserved.