Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从另一个构造函数继承是否会覆盖继承的构造函数的原型链中的现有属性_Javascript - Fatal编程技术网

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

Javascript 从另一个构造函数继承是否会覆盖继承的构造函数的原型链中的现有属性,javascript,Javascript,这里我有两个构造函数,第一个和第二个 第一个从第二个继承。第一个在其原型链上也有一个hair属性 一个新创建的对象称为tom,它应该是第一个构造函数的实例,它还具有一个名为nail的用户定义属性 如果我想使用for…in循环记录tom对象的所有可枚举属性,它只显示名称、指甲和年龄。但是hair属性似乎从其原型链中消失了 为什么头发属性从原型链中消失??我怎样才能把它拿回来 <html> <body> <script> function First(nam

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

第一个从第二个继承。第一个在其原型链上也有一个hair属性

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

如果我想使用for…in循环记录tom对象的所有可枚举属性,它只显示名称、指甲和年龄。但是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>

功能优先(名称){
this.name=name;
}
首先,prototype.hair='black';//汤姆,头发让我无法定义
函数第二(){
这个。年龄=1;
}
First.prototype=new Second();
变量tom=新的第一个(“tom”);
汤姆,钉子是锋利的为tom添加了属性
for(tom中的var i){
控制台日志(i);
}
console.log(tom.hair);

您覆盖了上的
原型

First.prototype=new Second();
成功

First.prototype.age=new Second().age;
它是有效的


您覆盖了上的
原型

First.prototype=new Second();
成功

First.prototype.age=new Second().age;
它是有效的

是在

First.prototype 

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);
}
是在

First.prototype 

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

问题是您首先为
设置默认原型的
hair
属性,然后将其替换为新原型,这意味着您的原始原型将丢失。如果像这样对语句重新排序,它将起作用:

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

问题是您首先为
设置默认原型的
hair
属性,然后将其替换为新原型,这意味着您的原始原型将丢失。如果像这样对语句重新排序,它将起作用:

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

这个语句首先不清楚。prototype.age=new Second();你能详细说明你的答案吗?我的意思是为什么它会起作用??当你先开始一行
First.prototype=newsecond()覆盖整个
原型
对象。还有
.prototype.hair
.hair
不再存在,因为您说的是类似于
prototype={}
的东西。第一部分是正确的,但解决方案是不正确的,
age
属性现在是一个对象,而不是
1
您的新日志显示的是一个
第二个
对象,其
age
属性为
1
,它应该只显示
1
。如果你
console.log(tom.age.age)
当你应该得到
未定义的
时,你会得到
1
。基本上,您的解决方案不会设置新的原型,而是在现有原型上添加一个属性,而这不是OP试图实现的有趣的解决方案。了解了一些新的逻辑:)此语句首先不清楚。prototype.age=new Second();你能详细说明你的答案吗?我的意思是为什么它会起作用??当你先开始一行
First.prototype=newsecond()覆盖整个
原型
对象。还有
.prototype.hair
.hair
不再存在,因为您说的是类似于
prototype={}
的东西。第一部分是正确的,但解决方案是不正确的,
age
属性现在是一个对象,而不是
1
您的新日志显示的是一个
第二个
对象,其
age
属性为
1
,它应该只显示
1
。如果你
console.log(tom.age.age)
当你应该得到
未定义的
时,你会得到
1
。基本上,您的解决方案不会设置新原型,而是在现有原型上添加一个属性,这不是OP试图实现的Interest解决方案。了解了一些新逻辑:)您可能希望通过调用Second.call(此)使用Object.create而不是创建Second的实例用作First.prototype,因为现在您正在混合共享成员和实例特定成员(年龄)更多信息:您可能希望通过调用Second.call(this)重新使用第二个构造函数并使用Object.create,而不是创建第二个用作第一个的实例。prototype因为现在您正在混合共享成员和实例特定成员(年龄)更多信息: