在下面的代码中,我试图理解分配给原型对象的方法的行为以及在函数Vehicle的对象定义中定义的方法:
function Vehicle(theMake) {
var make = theMake;
//this. attachs "make" to this instance of
//the object Vehicle which is infact an object of type Object
this.getInfo = function () {
return 'Local definition of getInfo, Vehicle: ' + make;
};
}
Vehicle.prototype.getInfo = function () {
//prototype will not have access to the variable make
return 'Overriding getInfo for all instances of Vehicle';// which later I realized is just the opposite( check the selected answer)
}
var car1 = new Vehicle('Honda');
alert(car1.getInfo());//Displays: Local definition of getInfo, Vehicle: Honda
1-尽管提供了Vahicle.prototype.getInfo()的定义,为什么要调用car1.getInfo()? (本地副本不是通用副本?)为什么它会被忽略?
如果我删除" this.getInfo = function()..." 那么通用的getInfo将由car1.getInfo()
调用2 - 如何调用car1.prototype.getInfo())?如果我把它称为car1.prototype.getInfo()。call 口译员说:无法获得财产“getInfo'未定义或空引用
答案 0 :(得分:3)
您应该只在一个地方分配getInfo
。无论是在原型中还是在构造函数中(最好是原型),但不是两个地方。
如果同时执行这两项操作,则构造函数中指定的那个将优先,因为它被分配给首先搜索的实际对象(在搜索原型之前)。仅当没有具有所需名称的属性已直接附加到对象时,才使用原型。因为您已将.getInfo
属性直接分配给构造函数中的对象,所以在解析该属性名称时不会搜索原型(因为它已经找到)。
由于您的代码表明您认为.prototype
版本是覆盖,因此看起来您只是向后拥有该逻辑。分配给构造函数中对象的getInfo()
将覆盖原型。
如果您真的想要执行原型版本,可以直接在原型上访问它:
Vehicle.prototope.getInfo.call(car1);
但是,如果你想要访问这两种方法,你应该给它们不同的名称,这样它们就可以作为car1.method1()
和car1.method2()
访问。
总结你的具体问题:
1-尽管提供了Vahicle.prototype.getInfo()的定义, 为什么要调用car1.getInfo()? (本地副本不是 一般的?)为什么它被忽略?
在原型之前搜索对象本身,因此解释器将首先找到直接分配给构造函数中对象的getInfo,并且不会搜索原型。
2 - 如何调用car1.prototype.getInfo())?如果我称之为 car1.prototype.getInfo()。调用解释器说:无法得到 物业' getInfo'未定义或空引用
最好的解决方案是为这两个函数赋予不同的名称,以便它们以传统方式可调用。如果您必须调用原型版本,则可以Vehicle.prototope.getInfo.call(car1);
。
有人可能会问,你为什么给这两个函数赋予相同的属性名?这首先是造成问题的原因。
答案 1 :(得分:2)
原型链允许对象在构造函数上查找失败时委托给它原型。您提供了一个不会出现查找失败的实例,因此无需在原型上查找该方法。