我有一个名为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”。 你们中的任何一个都可以解释为什么我的继承无效吗?
答案 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);
您可能可以同时使用这两种模式,但这会造成混乱。