JavaScript中的原型概念
我有一些关于原型的问题 如果我们通过JavaScript中的原型概念,javascript,prototype,prototype-chain,jsobject,Javascript,Prototype,Prototype Chain,Jsobject,我有一些关于原型的问题 如果我们通过Person函数构造函数的帮助创建了一个对象,比如说Dog。 假设Person在每个实例成员上有2个属性 var Dog = function (name,color){ this.name = name, this.color = color }; 现在我们已经从中创建了10个对象,比如Pug,Bulldog,等等 var Pug =new Dog('pug','white'); var Bulldog =new Dog('Bulldog',
Person
函数构造函数的帮助创建了一个对象,比如说Dog
。
假设Person
在每个实例成员上有2个属性
var Dog = function (name,color){
this.name = name,
this.color = color
};
现在我们已经从中创建了10个对象,比如Pug
,Bulldog
,等等
var Pug =new Dog('pug','white');
var Bulldog =new Dog('Bulldog','black');
现在我们突然想在Dog中添加一个属性,这样所有对象都可以访问它。我们可以通过两种方式实现:
this.leg:4
Pug { name : 'pug',color :'white'}
_ proto_ : { leg :4 }
我期待的是:
Pug { name : 'pug',color :'white',leg :4 }
_proto_ :Object
当您执行此操作时,
Dog.prototype.leg=4代码>您实际上是在修改原型本身。但是,将来实例化的对象将继承该新属性作为实例属性
内存中的现有实例在实例化时将继续使用预先存在的实例属性
var Dog=函数(名称、颜色){
this.name=name,
这个颜色
};
log(“内存中的现有实例”);
let toy=新狗(“玩具”、“棕色”);
let tay=新狗(“tay”、“灰色”);
console.log(玩具“\n”,tay);//内存中的现有实例。
log(“内存中的未来实例”);
Dog.prototype.leg=4;
让脚趾=新狗(“泰伊”,“黑色”);
控制台。日志(脚趾);//内存中的未来实例。
.as控制台包装{max height:100%!important;top:0;}
使用选项1将在创建的每个新对象上附加一个实例属性:
var Dog=函数(名称、颜色){
this.name=name,
这个颜色
};
var Pug=新狗('Pug','white');
var Bulldog=新狗('Bulldog','black');
//覆盖构造函数
var Dog=函数(名称、颜色){
this.name=name,
this.color=color,
这个腿=4
};
var Dalmatian=新狗(‘Dalmatian’、‘斑点’);
//同时检查浏览器控制台
控制台日志(Dalmatian);
控制台日志(达尔马提亚腿)
console.log(Dalmatian.hasOwnProperty('leg'));
控制台日志(斗牛犬);
控制台.日志(斗牛犬.腿)
console.log(Bulldog.hasOwnProperty('leg'))
在第一个选项中,您没有更改原型-如果您更改构造函数,那么您将得到预期的结果,因为这意味着通过构造函数创建的任何新实例都具有该属性。如果您想更改现有成员,那么您没有选择自动执行此操作-您可以重新创建所有成员,也可以收集所有成员并在循环中进行更改。您不能自动将属性从原型转移到每个实例。“因此未来的对象将继承该新属性”以及任何当前对象,因为原型链是活动对象。@VLAZ原型对象是,实例(构造函数属性)没有。您的回答表明,在您修改原型后,当前对象将不会获得leg
属性,但它们确实获得了。“当前”和“未来”对象之间没有区别-在这两种情况下,它们都获得leg
属性,并且它总是来自原型,它不是实际Dog
对象上的实例属性。答案仍然不正确-对象没有获取实例属性-原型更改前后的所有Dog对象都从原型获取新原型。旧的和新的实例属性都不会得到新的实例属性-它总是相同的。它们都共享相同的属性,如果您使用toy.leg=3
,那么所有的狗都将是三条腿的。抱歉,toy.leg=3
将分配一个实际实例属性,因此其余的狗将拥有leg=4
。不过,prototype属性不是实例属性。非常感谢
Pug { name : 'pug',color :'white'}
_ proto_ : { leg :4 }
Pug { name : 'pug',color :'white',leg :4 }
_proto_ :Object