Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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_Prototypal Inheritance - Fatal编程技术网

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)您正在创建一个新对象并将其粘贴为原型。您正在混合实例和原型。