设置__proto__的对象,而初始原型

设置__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__财产二传手一些内在逻辑,但不知道)

+0

创建时使用'null'作为原型的对象,也不会有'_proto__'组,因为有该对象没有原型链可言。当你手动设置'__proto__'时,它就成为对象中常规的属性。 ('obj .__ proto __。setTime' - > function) – Teemu

当你做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)

+0

[MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf)似乎相当确信,你根本不应该改变物体的原型。 – Teemu

+0

@Teemu有时你肯定需要它[数组子类](http://*.com/a/39653262/4543207)和数组子类是一个美丽的东西,如果你想有自定义数组原型方法,根本不修改'Array.prototype'。 – Redu

+0

的确如此,但我在代码中没有看到太多的数组子类。通常情况下,Array原型只是喜悦而已。 Kangax编写了一个[有趣的arcticle](主题为http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/)。 – Teemu