所以我目前有以下代码片段。我正在尝试创建一个Cylon类,其中包含一个模型属性和一个原型attack()方法。我正在创建一个HumanSkin类,该类继承自Cylon,并且还添加了自己的原型infiltrate()方法。

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);返回Undefined?如何轻松地在JS中获得完全继承(最好是通过封装)?

最佳答案

当你说,

HumanSkin.prototype = new Cylon();


您正在使用空模型(Cylon)创建undefined的新对象。因此,从Cylon继承,可以像这样进行改进

HumanSkin.prototype = Object.create(Cylon.prototype);


请注意,当您通过原型继承进行继承时,父级prototype中的任何内容将对子级可用。但是modelCylon的构造函数中。通常,可以这样解决

function HumanSkin(model) {
    Cylon.call(this, model);
}


现在,每当构造一个新的HumanSkin对象时,内部的Cylon函数都将被当前对象(this)调用,并且model将作为参数传递给该对象。因此,Cylon将在当前对象中初始化model

10-06 15:14