JavaScript中的基本/高效原型继承?
因此,我目前有以下代码片段。我正在尝试创建一个JavaScript中的基本/高效原型继承?,javascript,prototypal-inheritance,Javascript,Prototypal Inheritance,因此,我目前有以下代码片段。我正在尝试创建一个Cylon类,它包含一个模型属性和一个原型attack()方法。我正在创建一个HumanSkin类,该类继承自Cylon,并添加了自己的原型infire()方法 function Cylon(model){ this.model = model; } Cylon.prototype.attack = function(){ return("Destroy all humans!"); } function HumanSkin(){}
Cylon
类,它包含一个模型属性和一个原型attack()
方法。我正在创建一个HumanSkin
类,该类继承自Cylon
,并添加了自己的原型infire()
方法
function Cylon(model){
this.model = model;
}
Cylon.prototype.attack = function(){
return("Destroy all humans!");
}
function HumanSkin(){}
HumanSkin.prototype = new Cylon();
HumanSkin.prototype.infiltrate = function(){
return("Infiltrate the colonies");
}
cylon = new Cylon("raider");
caprica = new HumanSkin(6);
我的问题是——为什么是console.log(caprica.model)代码>返回未定义?如何在JS中轻松获得完全继承(最好是封装) 当你说
HumanSkin.prototype = new Cylon();
您正在创建一个新的赛昂对象
,模型为空(未定义
)。所以,从赛昂人继承下来,可以这样改进
HumanSkin.prototype = Object.create(Cylon.prototype);
function HumanSkin(model) {
Cylon.call(this, model);
}
请注意,当您使用原型继承进行继承时,父对象的prototype
中的任何内容都将对子对象可用。但是模型
在赛昂人的构造函数中。通常,这可以这样解决
HumanSkin.prototype = Object.create(Cylon.prototype);
function HumanSkin(model) {
Cylon.call(this, model);
}
现在,每当您构建一个新的HumanSkin
对象时,内部Cylon
函数将被当前对象(this
)调用,并且model
将作为参数传递给该对象。因此,Cylon
将在当前对象中初始化模型。当您说
HumanSkin.prototype = new Cylon();
您正在创建一个新的赛昂对象
,模型为空(未定义
)。所以,从赛昂人继承下来,可以这样改进
HumanSkin.prototype = Object.create(Cylon.prototype);
function HumanSkin(model) {
Cylon.call(this, model);
}
请注意,当您使用原型继承进行继承时,父对象的prototype
中的任何内容都将对子对象可用。但是模型
在赛昂人的构造函数中。通常,这可以这样解决
HumanSkin.prototype = Object.create(Cylon.prototype);
function HumanSkin(model) {
Cylon.call(this, model);
}
现在,每当您构建一个新的HumanSkin
对象时,内部Cylon
函数将被当前对象(this
)调用,并且model
将作为参数传递给该对象。因此,Cylon
将在当前对象中初始化model
。Hi--回答得很好,谢谢!有更好的方法封装原型类吗?我不喜欢构造函数方法和原型代码是如何分开的。@好吧,这实际上是最好的方法。因为,构造函数中的任何内容都将在每次创建对象时创建。因此,最好将函数放在原型中,将所有特定于实例的数据放在构造函数中。@Prefix您可能还想了解Cylon.call(这个,模型)的优点是什么代码>在<代码>这个上。_u原型=新赛昂(模型)代码>?@前缀有两件事。1) ,2)您正在创建一个新对象并将其粘贴为原型。您正在混合实例和原型。您好--回答得很好,谢谢!有更好的方法封装原型类吗?我不喜欢构造函数方法和原型代码是如何分开的。@好吧,这实际上是最好的方法。因为,构造函数中的任何内容都将在每次创建对象时创建。因此,最好将函数放在原型中,将所有特定于实例的数据放在构造函数中。@Prefix您可能还想了解Cylon.call(这个,模型)的优点是什么代码>在<代码>这个上。_u原型=新赛昂(模型)代码>?@前缀有两件事。1) ,2)您正在创建一个新对象并将其粘贴为原型。您正在混合实例和原型。