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