设置__proto__的对象,而初始原型
让我们创建新的对象,然后改变它的原型:设置__proto__的对象,而初始原型
var obj = new Object;
obj.__proto__ = new Date;
obj.setTime // is a function
我们看到,现在obj
继承其新的原型,new Date
性能。
然后,我们没有原型创建新的对象,改变它的原型:
var obj = Object.create(null);
obj.__proto__ = new Date;
obj.setTime // undefined
我们看到,原型链不工作 - obj
没有从new Date
继承性,即使它的__proto__
是new Date
。
为什么?
(我想这是因为Object
在__proto__
财产二传手一些内在逻辑,但不知道)
当你做var obj = Object.create(null);
,你创建一个没有__proto__
一个对象。
在行后行中,您只需创建一个名为__proto__
的字段,并且仔细查看该字段本身会有一个名为__proto__
的内部字段。
您可以使用任何名称创建任何字段。在你的情况下,你选择__proto__
作为该字段的名称。它可能是任何东西。
当我们需要显式访问/修改对象的原型时,这是__proto__
和Object.getPrototypeOf()
/Object.setPrototypeOf()
之间的一个细微差别。
这就是为什么我确信我们应该使用Object.setPrototypeOf()
和Object.getPrototypeOf()
代替__proto__
的原因之一。
var o = Object.create(null);
Object.setPrototypeOf(o, new Date());
console.log(o.setTime)
[MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf)似乎相当确信,你根本不应该改变物体的原型。 – Teemu
@Teemu有时你肯定需要它[数组子类](http://*.com/a/39653262/4543207)和数组子类是一个美丽的东西,如果你想有自定义数组原型方法,根本不修改'Array.prototype'。 – Redu
的确如此,但我在代码中没有看到太多的数组子类。通常情况下,Array原型只是喜悦而已。 Kangax编写了一个[有趣的arcticle](主题为http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/)。 – Teemu
创建时使用'null'作为原型的对象,也不会有'_proto__'组,因为有该对象没有原型链可言。当你手动设置'__proto__'时,它就成为对象中常规的属性。 ('obj .__ proto __。setTime' - > function) – Teemu