假设我创建了一个名为Person的类。
var Person = function(fname){this.fname = fname;};
pObj是我从这个类中创建的对象。
var pObj = new Person('top');
现在我向Person类添加一个属性,比如说lname。
Person.prototype.lname = "Thomsom";
现在pObj.lname让我“汤姆森”。
我的问题是,当pObj没有在其中找到属性lname时,它如何知道在哪里寻找。
答案 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"
中。