对象如何在javascript中了解其父对象

时间:2010-05-14 10:38:25

标签: javascript

假设我创建了一个名为Person的类。

var Person = function(fname){this.fname = fname;};

pObj是我从这个类中创建的对象。

var pObj = new Person('top');

现在我向Person类添加一个属性,比如说lname。

Person.prototype.lname = "Thomsom";

现在pObj.lname让我“汤姆森”。

我的问题是,当pObj没有在其中找到属性lname时,它如何知道在哪里寻找。

5 个答案:

答案 0 :(得分:2)

这与javascript引擎如何解析引用有关。 它将从本地变量对象(绑定到范围)开始,然后“走”原型链,直到它找到它或到达顶部。

您可以在http://dmitrysoshnikov.com/ecmascript/chapter-4-scope-chain/

详细了解详情

答案 1 :(得分:1)

每个对象都有一个称为[[Prototype]]的内部属性,它带有对另一个对象的引用,称为其原型。当JS解释器无法在对象自己的成员中找到命名属性时,它会在对象的原型中查找它们,然后在原型的原型中查找它们,依此类推,直到达到Object.prototype,即每个对象的最低原型,它本身没有[[Prototype]]

[[Prototype]]运算符为prototype属性分配了构造函数的new属性的值。因此,当您致电new Person时,新对象会收到[[Prototype]]= Person.prototype。创建函数时,它会为其prototype属性获取一个新的空对象,但您可以完全重新分配构造函数的.prototype以及向其中写入新成员。

但是[[Prototype]]属性在对象的生命周期内保持不变;特别是,当向Person.prototype添加新成员使其在所有Person个实例中可见时,向Person.prototype分配新对象不会更改现有Person实例的原型。

通常,[[Prototype]]是一个不可见的实现细节。但在Mozilla中,[[Prototype]]内部属性在公共__proto__属性下公开。这种非标准扩展已被Opera,Safari和Chrome采用,但不是IE。一般来说,它被认为是糟糕的形式。

在ECMAScript第五版中,您将能够使用新函数[[Prototype]]获取Object.getPrototypeOf(person)值。到目前为止浏览器支持很差。

答案 2 :(得分:0)

它看起来是它的类原型。

答案 3 :(得分:0)

每个对象都有一个原型。当没有为对象实例设置属性时,它会在对象的原型中查找。在Gecko和WebKit中,您可以使用对象的__proto__属性来获取(或设置)对其原型的引用。

您可以使用标准myObj.constructor.prototype

获取对象原型

答案 4 :(得分:0)

Person类有一个prototype,它是Person类型实例的继承链。由于该原型具有lname属性集,因此任何类型为Person的实例(例如pObj)将使用相应的值,除非实例已覆盖它,例如在pObj.lname = "Johnson"中。