我正在研究javascript中的继承,我偶然发现了一个关于共享原型函数的问题。这是我的代码:
function basicID(id,firstname,lastname){
this.firstname=firstname;
this.lastname=lastname;
}
basicID.prototype = {
setFirstName:function(firstname){
this.firstname=firstname;
},
setLastName:function(lastname){
this.lastname=lastname;
},
getFirstName:function(){
return this.firstname;
},
getLastName:function(){
return this.lastname;
}
};
如果通过
进行测试var empID = new basicID();
empID.setFirstName("Pink Panther");
alert(empID.getFirstName());
效果很好。
然后我想使用以下内容创建此basicID的子类。
function advancedID(id,firstname,lastname,address,picture,accesscode){
basicID.call(this,id,firstname,lastname);
this.address=address;
this.picture = picture;
this.accesscode= accesscode;
}
advancedID.prototype = basicID.prototype;
然后通过...测试...
var employeeID = new advancedID();
employeeID.setFirstName("Black Panther");
alert(employeeID.getFirstname())
仍然有效!但是当我添加原型函数时,例如:
advancedID.prototype = {
setAddress : function(address){
this.address = address;
},
getAddress : function(address){
return this.address;
}
}
然后我用
测试advanceID自己的功能employeeID.setAddress("Metropolis");
alert(employeeID.getAddress())
它不起作用!我怀疑这条线
advancedID.prototype = basicID.prototype;
对于错误。因为它改变了特定对象的原型对象。如何同时从basicID和advancedID继承这两个函数?
答案 0 :(得分:0)
嗯,你没有很好地获得原型继承,但首先要做的事情是:
当你这样做时:
advancedID.prototype = {
setAddress : function(address){
this.address = address;
},
getAddress : function(address){
return this.address;
}
}
您正在使用此对象替换advancedID
的整个原型。因此advancedID
和basicID
不再共享原型。 basicID.prototype
仍然是原始版本,但advancedID
已更改。
如果要向原型添加属性,则应附加:
advancedID.prototype.getAddress = function() {...}
现在你会看到你保留以前的方法。
但是,如果你这样做,你会看到:
empID.getAddress();
您没有收到错误消息。你的意图是advancedID
继承basicID
,但实际上,现在他们都共享了原型。对一个的任何改变,反映在另一个。
使“类”继承自另一个的正确方法是:
advancedID.prototype = Object.create(basicID.prototype);
这导致:
Object.getPrototypeOf(advancedID.prototype) === basicID.prototype.
如果你提出basicID
的原型,advancedID
会获得新的方法,但不会发生相反的情况。