2014-08-28 8 views
2

Я пытаюсь использовать наследование, но я застрял. Я получаю сообщение об ошибке и не знаю, что я делаю неправильно. Все примеры, которые я вижу в Интернете, не передают объекты в их конструкторы, поэтому я не уверен, что я должен делать. Вот упрощенный вниз пример -JavaScript - ошибка с наследованием

function Automobile(obj){ 
    this.name = obj.name; 
    this.model = obj.model; 
} 

Automobile.prototype = { 
    getName: function(){ 
     console.log(this.name); 
    }, 
    getModel: function(){ 
     console.log(this.model); 
    } 
} 

var bmw = new Automobile({ 
    name: 'BMW', 
    model: 'm5' 
}) 

bmw.getName(); 
bmw.getModel(); 


function Truck(obj){ 
    this.cabSize = obj.cabSize 
} 

Truck.prototype = new Automobile(); 
Truck.prototype = { 
    getCabSize: function(){ 
     console.log(this.cabSize); 
    } 
} 

var fordF150 = new Truck({ 
    name: 'Ford', 
    model: 'F150' 
}) 

//Uncaught TypeError: Cannot read property 'name' of undefined test.js:2 
//Automobile test.js:2 
//(anonymous function) 
+0

Вы не передали объект, когда вы вызывали 'Truck.prototype = new Automobile(); его ожидали, что первым параметром будет объект. – Musa

ответ

3

Ошибка возникает при Truck.prototype = new Automobile();. Вы не проходите obj, который ожидает Automobile.

Чтобы избежать этого попробуйте Truck.prototype = Object.create(Automobile.prototype)

После этого использования

Truck.prototype.getCabSite = function(){ 
} 

так, чтобы не перезаписать наследуемые свойства из Automobile.

+0

Есть ли способ, которым я могу это сделать, и сохранить Truck.prototype = {...}, чтобы добавить новые методы? Не огромная сделка, я просто предпочитаю добавлять прототипы таким образом. – Ben

+0

Вы можете сделать 'Грузовик.prototype.WhateverYouWantToAdd = function() {} 'снова и снова – user145400

0

Вместо этого:

Truck.prototype = { 
    getCabSize: function(){ 
     console.log(this.cabSize); 
    } 
} 

Попробуйте это:

Truck.prototype.getCabSite = function(){ 


} 

Truck.prototype.constructor = Truck; //this will insure the appropriate constructor is called 

таким образом Вы не удаляете избавиться от автомобиля Protoype

+0

Спасибо onzur. Я как-то хотел бы сохранить форматирование Truck.prototype = {}, поэтому я могу добавить больше методов таким образом. Не знаете, как я могу настроить Truck на наследование Automobile и все еще делать это? Во всяком случае, я все равно получаю сообщение об ошибке «Uncaught TypeError: Can not read property» неопределенной ошибки с этим обновлением. – Ben

+0

Если вы используете jQuery, вы можете использовать '$ .extend()' для слияния объектов. – Barmar

0
  1. Вы изменили «прототип» грузовика -> вы не можете наследовать.

    Truck.prototype = new Автомобиль();
    Truck.prototype = { getCabSize: function() { console.log (this.cabSize); } }; // Изменить прототип грузовика

    Вы можете отремонтировать

    Truck.prototype.getCabSize = функция() {};

1 Пример о смене прототипа, я пишу некоторые строки кода используйте ваш автомобильный функция

function Automobile(obj){ 
    this.name = obj.name; 
    this.model = obj.model; 
} 

Automobile.prototype = { 
    getName: function(){ 
     console.log(this.name); 
    }, 
    getModel: function(){ 
     console.log(this.model); 
    } 
} 

var bmw = new Automobile({ 
    name: 'BMW', 
    model: 'm5' 
}) 

Automobile.prototype = { 
      sayHello:function(){ 
      console.log("Hello, I'm new"); 
     } 
} 

// Make new Automobile 

var honda = new Automobile({ 
    name: 'BMW', 
    model: 'm5' 
}); 

// Try to call getName, getModel 
bmw.getName(); // BMW 
bmw.getModel(); // m5 

honda.getName(); // TypeError : undefined is not function 
honda.getModel(); // TypeError : undefined is not function 

// Try to call sayHello 

bmw.sayHello(); // TypeError : undefined is not function 

honda.sayHello(); // Hello, I'm new 

Почему BMW нельзя назвать SayHello и Хонда не могу назвать GetName и getModel? Поскольку я изменил ссылку на прототип Automobile после создания объекта bmw. bmw содержит ссылку на «старый» прототип, содержащий getName, getModel, но не sayHello. И honda ссылается на «новый» прототип, который содержит sayHello, но не getName и getModel.

Надеюсь, это поможет вам.

Смежные вопросы