2016-08-18 97 views
0

我一直在阅读javascript的constructor__proto__。我想我明白__proto__属性的基本知识,但是我对constrcutor属性有点麻烦。这是我目前为止所了解的有关这两个属性的信息,如果我错了,请纠正我,或者如果我错过了某些要点,请添加。 javascript中的每个对象都有一个名为__proto__的“隐藏”属性,默认情况下指向Object.prototype。现在,当使用new创建对象的实例时。修改此属性的值并分配对象ConstructorName.prototype。我不确定什么__proto__的默认值是在调用new之前。现在关于.constructor我有点困惑我看了this,到目前为止认为constructor属性默认是空的,当新的被调用时constrcutor被修改并分配了ConstructorName.prototype.constructor 。请让我知道我是否朝着正确的方向前进。关于构造函数和__proto__属性的说明

回答

1

在javascript每个对象都有一个 “隐藏” 的属性称为__proto__

号隐藏属性称为[[原型]].__proto__是访问它弃用吸气,你应该使用Object.getPrototypeOf

它默认指向Object.prototype

“default”可能会引起误解 - 取决于对象的创建方式。对于普通对象文字,是的,它是Object.prototype

现在,当一个对象的实例使用new创建。此属性的值将被修改并分配给对象ConstructorName.prototype。我不确定__proto__的默认值是在新的被调用之前。

在此之前没有任何价值。该对象是在原型从一开始就被设置的情况下创建的。在调用new之前,没有任何对象。

现在关于.constructor我有点困惑我读到这也是迄今为止相信在默认情况下是constructor属性是空的,被调用的新当constrcutor被修改,分配ConstructorName.prototype.constructor

不,没有任何东西被分配到任何地方,没有.constructor属性的实例。他们做继承财产(连同其他人)从.prototype对象。 在创建ConstructorName函数的实例中创建了ConstructorName.prototype.constructor属性。

+0

感谢您的帖子。你提到“在调用new之前,没有任何对象”,在这个问题的部分我要问的是,当我们在这种情况下声明一个普通对象(即)'foo = {}'时,默认的'foo .__ proto__ = Object.prototype',一旦我们通过做'var f = new foo()'来创建一个实例,那么'f .__ proto__ = foo.prototype'我是否正确? –

+0

是的。 'foo = {}'等价于'foo = Object.create(Object.prototype)','f = new foo'等同于'f = Object.create(foo.prototype); f.constructor()' – Bergi

+0

好的感谢清理。你提到的最后一个问题是“实例上没有.constructor属性,它们继承了.prototype对象的属性(以及其他属性)。” 。第一个例子中的链接http://javascript.info/tutorial/constructor似乎表明该实例具有属性'.constructor'(ie)'alert(rabbit.constructor == Rabbit)// true'我是一个这里一点困惑。我在这里详细介绍吗? –