为什么将构造函数的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
是,您的观察是正确的-在这种情况下,使用new
运算符构造的函数将[[总是具有对象原型,这确实不同于使用Object.create创建的函数。
Object.prototype
中:new
函数方法的[Quoting the specification,它指示如何使用[[Construct]]
运算符创建对象,我们可以看到指定了以下内容:
如果(obj.prototype的类型)不是Object,则将obj的[[Prototype]]内部属性设置为标准内置的Object原型对象,如15.2.4中所述。
在new
中:另一方面,如果我们查看
Object.create
,则可以看到The spec forObject.create
指定:将obj的[[Prototype]]内部属性设置为O。
这意味着我们可以设置它,它还会在该算法中显式检查它是否为null或Object(请跟随规范的链接并阅读它:))do
因此,用Object.create
调用的对象的原型是Object.create(o)
,而不是new Foo
。仅使用标准方法,如果没有Object.prototype
,就无法创建没有原型的对象。