我已经阅读了很多关于原型继承是如何工作的以及解释器如何通过原型链来寻找财产。
function Man()
{
this.hands=2;//1
}
function father()
{
this.name="";
}
father.prototype= new Man();//2
var malay= new father();
var abhik= new father();
现在我的问题是声明#1& #2只被调用一次。那么“abhik”和“malay”应该共享同一个Man对象吗? 所以内存中会有3个对象。 1.abhik 2.malay 3.man(两个共享的一个实例) 那么通过这个逻辑,改变的值应该在对象之间共享?
malay.hands=3;
console.log(abhik.hands);
abhik.hands=4;
console.log(malay.hands);
但事实并非如此。 为什么这样 ?
答案 0 :(得分:2)
您的理解是正确的,有3个对象,abhik
和malay
都来自同一个Man
实例。但是,当您在hands
和malay
对象上设置新的abhik
属性时,您会为它们提供自己的hands
属性,并且它们不再继承hands
属性来自原型Man
。
<强>插图:强>
首次创建malay
和abhik
后,这里是对三个对象的模拟:
father.prototype -> {hands: 2}
malay -> {name: ""} // Empty name property, NO hands property
abhik -> {name: ""} // Empty name property, NO hands property
当您检查hands
或malay
上的abhik
属性时,解释程序会看到没有此类属性,并会检查原型链并发现其父级father.prototype
确实有hands
属性,因此解释器会报告该值2
。
设置hands
属性后,您的对象如下所示:
father.prototype -> {hands: 2}
malay -> {name: "", hands: 3} // Empty name property, OWN hands property
abhik -> {name: "", hands: 4} // Empty name property, OWN hands property
现在,您的对象都有自己的hands
属性。
资源:这是一篇关于javascript继承的写得很好(但很长)的文章: http://manuel.kiessling.net/2012/03/23/object-orientation-and-inheritance-in-javascript-a-comprehensive-explanation/
答案 1 :(得分:1)
如果您需要在实例之间共享基本类型或不可变,您可以使用闭包来保留它的值并使用getter和setter来访问它。
function Man()
{
var hands=2;
return {
getHands:function(){
return hands;
},
setHands:function(number){
hands=number;
}
}
}
function Father(name)
{
this.name=name;
}
Father.prototype= Man();
malay=new Father("malay");
abhik=new Father("abhik");
malay.setHands(4);
console.log(abhik.getHands());
console.log(malay.getHands());
如果您需要父亲成为人类的实例,您可以执行以下操作:
function Hands(){
var hands=2;
return {
get:function(){
return hands;
},
set:function(number){
hands=number;
}
}
}
function Man(){
this.age=18;
this.array=[];
}
Man.prototype.hands=Hands();
function Father(name){
//take ownership (copy) of every variable
//defined in the Man function body
//with this.... prototype defined
//are still shared among instances
Man.call(this);
this.name=name;
}
Father.prototype= new Man();
malay=new Father("malay");
abhik=new Father("abhik");
malay.hands.set(4);
console.log(abhik.hands.get());
console.log(malay.hands.get());
malay.age=34;
console.log(abhik.age);//from Man.age
console.log(malay.age);//from malay.age
delete malay.age;
console.log(malay.age);//from Man.age
malay.array.push(22);
console.log(abhik.array);// is [] but would be [22]
// if Man.call(this) was not in the Father function
console.log(malay instanceof Man);