2016-08-14 42 views
1

我正在學習JavaScript繼承。我發現了一個很好的解釋在這裏: JavaScript Inheritance不理解Javascript繼承

function A() { 
    B.call(this); 
} 

function B() { 
    C.call(this); 
    this.bbb = function() { 
     console.log("i was inherited from b!"); 
    } 
} 

我想基於以上和其他的解決方案來實現繼承(有一羣人在網上,他們都似乎表明不同的東西)。無論如何,我試圖讓SportsCar繼承Car並使用汽車的describeSelf方法。我不確定我做錯了什麼。 PLUNK for convenience

var Car = function(make, topSpeed, color){ 
    this.make = make; 
    this.topSpeed = topSpeed; 
    this.color = color; 
} 

Car.prototype.describeSelf = function(){ 
    document.write('Hi, I am a: ' + this.make + ', my top speed is ' + this.topSpeed + ' and I am ' + this.color); 
} 

var corolla = new Car('toyota', 120, 'blue'); 

corolla.describeSelf(); 

//Code works fine up to here 
var SportsCar = function(engineSize, make, topSpeed, color) { 
    Car.call(this, make, topSpeed, color); 
    this.engineSize = engineSize; 
}; 

var fordGt = new SportsCar('V8', 'ford', 205 , 'red'); 

fordGt.describeSelf(); 

我真不明白什麼call一樣。

編輯:看起來我不清楚我在問什麼。問題的實質是讓這條線路工作:fordGt.describeSelf();並得到我目前做錯了什麼的解釋。

+0

@JaromandaX我欣賞這​​個鏈接,但是這並沒有幫助我理解如何向子對象的構造函數添加新屬性MDN上的示例不會傳遞新的道具 – VSO

+0

我的問題是如何使繼承正常工作,例如如何使這條線工作:fordGt.describeSe如果();我會更新這個問題。 – VSO

+0

你絕對沒有在SportCar的原型鏈中設置Car'SportCar.prototype = Object.create(Car);'。 –

回答

1

添加行註釋add this

var Car = function(make, topSpeed, color){ 
    this.make = make; 
    this.topSpeed = topSpeed; 
    this.color = color; 
} 

Car.prototype.describeSelf = function(){ 
    document.write('Hi, I am a: ' + this.make + ', my top speed is ' +  this.topSpeed + ' and I am ' + this.color); 
} 

var corolla = new Car('toyota', 120, 'blue'); 

corolla.describeSelf(); 

//Code works fine up to here 
var SportsCar = function(engineSize, make, topSpeed, color) { 
    Car.call(this, make, topSpeed, color); 
    this.engineSize = engineSize; 
}; 

// add this 
SportsCar.prototype = Object.create(Car.prototype); 

var fordGt = new SportsCar('V8', 'ford', 205 , 'red'); 

fordGt.describeSelf(); 

這是因爲您確實需要正確設置原型鏈,以便新創建的對象在鏈中具有其父原型。

如果,在另一方面,附加方法鏈可以忽略不計(因爲你已經從其他構造函數調用構造函數對象本身

var Car = function(make, topSpeed, color){ 
    this.make = make; 
    this.topSpeed = topSpeed; 
    this.color = color; 
    this.describeSelf = function() ... 
} 

,但是你會落得多個實例附加到新創建的實例相同的功能

+0

謝謝,這有很大的幫助。 – VSO