Наследование прототипов JavaScript не работает - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть объект с именем superCar.У меня есть функция автомобиля.Я хотел бы унаследовать мой объект Car от объекта SuperCar.Вот мой код:

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", "седан".Но вывод выходит как «Тойота», «Bmw», «undefined».Кто-нибудь из вас может объяснить, почему мое наследство не сработало?

1 Ответ

0 голосов
/ 29 сентября 2018

Вы немного смешиваете шаблоны наследования.Ваше наследование не работает, потому что model не входит в цепочку прототипов superCar, оно непосредственно на сам объект.

Вы можете сделать superCar функцией, подобной машине, и связать ее в цепочку наследования, например:

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);

Возможно, вы сможете смешать эти два паттерна, но это может сбить с толку.

...