JavaScript原型继承无效

时间:2018-09-29 02:44:07

标签: javascript inheritance prototype

我有一个名为superCar的对象。我有一个功能汽车。我想从superCar Object继承我的Car Object。这是我的代码:

var superCar = {
model : "sedan"
};
function Car(){
  this.name = null;
}

var c1 = new Car();
c1.name="Toyota";

var c2 = new Car();
c2.name="Bmw";

console.log(c1.name);
console.log(c2.name);

c1.__proto__.__proto__ = superCar.__proto__ ;

console.log(c1.model);

我希望结果是“丰田”,“宝马”,“轿车”。但是输出结果是“ Toyota”,“ Bmw”,“ undefined”。 你们中的任何一个都可以解释为什么我的继承无效吗?

1 个答案:

答案 0 :(得分:1)

您正在混用继承模式。您的继承无效,因为model不在superCar原型链上,而是直接在对象本身上。

您可以使superCar像car这样的函数,并将其绑定到继承链中,例如:

function superCar(){
    this.model = "sedan"
};
function Car(){
    superCar.call(this)  // this will add model and other properties assigned in the constructor 
    this.name = null;
}
Car.prototype  = Object.create(superCar.prototype); // this will add protoype methods from superCar, but there aren't any
  
var c1 = new Car();
 c1.name="Toyota";
    
var c2 = new Car();
c2.name="Bmw";
    
console.log(c1.name);
console.log(c2.name);
console.log(c1.model);
console.log(c2.model);

或者,您可以使用Object.create基于以下内容创建指向对象 superCar的原型链接:

let superCar ={
    model: "sedan"
};
function Car(name){
   let obj = Object.create(superCar) // obj will delegate to superCar when it doesn't find a property
   obj.name = name
   return obj
}
  
var c1 =  Car("Toyota");
var c2 =  Car("Bmw");
    
console.log(c1.name);
console.log(c2.name);
console.log(c1.model);
console.log(c2.model);

您可能可以同时使用这两种模式,但这会造成混乱。