继承自另一个构造函数会从继承的构造函数的原型链中覆盖现有属性

时间:2014-09-14 09:20:41

标签: javascript

这里我有两个构造函数说第一和第二。

首先从Second.First继承其原型链上的头发属性。

新创建的对象说tom应该是First构造函数的实例,它还有一个名为nail的用户定义属性。

如果我想使用for ... in循环记录tom对象的所有可枚举属性,它只显示name,nail和age.But hair属性似乎从其原型链中消失。

为什么头发属性从原型链中消失了?我该怎么办呢?

<html>
<body>
<script>
   function First(name){
       this.name=name;
   }
   First.prototype.hair='black';// tom.hair gets me undefined
   function Second(){
       this.age=1;
   }

   First.prototype=new Second();
   var tom=new First('tom');
   tom.nail='sharp';// added property to tom
   for(var i in tom){
       console.log(i);
   }
   console.log(tom.hair);
</script>
</body>
</html>

3 个答案:

答案 0 :(得分:2)

你覆盖了prototype

First.prototype=new Second();

制作

First.prototype.age=new Second().age;

它有效。

JSFIDDLE.

答案 1 :(得分:1)

First.prototype.hair 

之前宣布

First.prototype 

时,

Second构造的对象实例覆盖

First.prototype=new Second(); 

被调用。要将hair属性添加到First的原型中,请在分配通过调用Second创建的对象实例后将其添加到原型中,即

function First(name){
    this.name=name;
}

function Second(){
    this.age=1;
}

First.prototype=new Second();

// add to prototype after overwriting/assigning prototype above
First.prototype.hair='black';

var tom=new First('tom');
tom.nail='sharp';

for(var i in tom){
    console.log(i);
}

答案 2 :(得分:1)

问题是您在hair的默认原型上设置了First属性,然后将其替换为新原型,这意味着您的原始文件已丢失。如果你重新排序这样的语句,它将起作用:

function First(name){
    this.name=name;
}
function Second(){
    this.age=1;
}

First.prototype=new Second();
First.prototype.hair='black'; // this works now!

var tom=new First('tom');
tom.nail='sharp';// added property to tom
for(var i in tom){
    console.log(i);
}
console.log(tom.hair);