在原型继承期间创建父对象的次数

时间:2013-05-23 04:47:47

标签: javascript prototypal-inheritance prototype-programming

我已经阅读了很多关于原型继承是如何工作的以及解释器如何通过原型链来寻找财产。

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);

但事实并非如此。 为什么这样 ?

2 个答案:

答案 0 :(得分:2)

您的理解是正确的,有3个对象,abhikmalay都来自同一个Man实例。但是,当您在handsmalay对象上设置新的abhik属性时,您会为它们提供自己的hands属性,并且它们不再继承hands属性来自原型Man

<强>插图:

首次创建malayabhik后,这里是对三个对象的模拟:

father.prototype -> {hands: 2} 
malay -> {name: ""}   // Empty name property, NO hands property
abhik -> {name: ""}   // Empty name property, NO hands property

当您检查handsmalay上的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);