2014-08-28 71 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 2014-08-28 23:16:15

回答

3

錯誤發生在Truck.prototype = new Automobile();。你沒有傳遞obj,這是Automobile期望的。

爲了避免這種嘗試Truck.prototype = Object.create(Automobile.prototype)

在使用

Truck.prototype.getCabSite = function(){ 
} 

後,這樣你就不會從汽車覆蓋繼承的屬性。

+0

有沒有什麼辦法可以做到這一點,並保持Truck.prototype = {...}添加新的方法?沒有什麼大不了的,我只是喜歡用這種方式添加原型。 – Ben 2014-08-28 23:25:49

+0

你可以做'卡車。prototype.WhateverYouWantToAdd = function(){}'一遍又一遍 – user145400 2014-08-28 23:27:33

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 = {}格式,所以我可以以這種方式添加更多的方法。不知道如何設置卡車繼承汽車,仍然這樣做?無論如何,我仍然會收到「Uncaught TypeError:無法讀取未定義的屬性'名稱'錯誤與此更新。 – Ben 2014-08-28 23:16:37

+0

如果你使用jQuery,你可以使用'.extend()'來合併對象。 – Barmar 2014-08-28 23:17:47

0
  1. 您更改了卡車的「原型」 - >您無法繼承。

    Truck.prototype = new Automobile();
    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 

寶馬爲什麼不能打電話的sayHello和本田不能調用的getName和getModel? 因爲我在創建bmw對象後改變了汽車的原型參考。 bmw保存對包含getName,getModel而不是sayHello的「舊」原型的引用。本田持有含有sayHello但不包含getName和getModel的「新」原型的引用。

希望它能幫助你。