2012-06-09 177 views
2

我是Codeyear老鄉,不幸原型對象的概念沒有解釋。我google了一下,發現tutorial。在學習之後,我的理解是,我們使用原型對象繼承來節省內存並在對象之間共享公共屬性。 對不對?如果是的話,你不覺得下面的代碼是壞習慣。由於汽車製造商已經定義了價格,速度和getPrice,爲什麼我們需要再次定義相同的事物,因爲我們正在使用繼承的概念。請解釋 。下面是代碼。原型對象繼承

function Car(listedPrice) { 
    var price = listedPrice; 
    this.speed = 0; 

    this.getPrice = function() { 
     return price; 
    }; 
} 

Car.prototype.accelerate = function() { 
    this.speed += 10; 
}; 

function ElectricCar(listedPrice) { 
    var price = listedPrice; 
    this.speed = 0; 

    this.getPrice = function() { 
     return price; 
    }; 
} 

ElectricCar.prototype = new Car(); // Please also explain why car constructor 
            // is not thowing error since we are not passing 
            // listedPrice parameter 

myElectricCar = new ElectricCar(500); 

console.log(myElectricCar instanceof Car); 
+0

這可能會幫助你:http://stackoverflow.com/questions/10836064/what-does-anobject-prototype-constructor-do – Sarfraz

回答

3

構造函數和原型是兩個單獨的概念。當您將原型繼承與ElectricCar.prototype = new Car();一起應用時,它只會繼承在對象及其原型上定義的方法,而不是構造函數本身。

實際上,你可以看到這個作品用一些快速console.log()調用方式:

console.log(ElectricCar); 
console.log(ElectricCar.prototype); 
console.log(ElectricCar.prototype.__proto__); 

這將返回:

[Function: ElectricCar] 
{ speed: 0, getPrice: [Function] } 
{ accelerate: [Function] } 

第一行是構造函數。

第二個是實際的原型,如上面的ElectricCar.prototype = new Car();設置。請記住,在Car的構造函數中,設置了this.speedthis.getPrice,這解釋了值爲ElectricCar.prototype.speedElectricCar.prototype.getPrice

也許最不清楚的是最後一行ElectricCar.prototype.__proto__。這是原型的原型。 Car對象有一個prototype對象,其中accelerate被定義。這個原型被複制到ElectricCar的內部原型__proto__屬性中。這叫做prototype chaining

因爲構造函數是不是該原型的一部分,原型是你繼承所有,用於Car構造已經被複制並粘貼到ElectricCar。正如你指出的那樣,確實有更乾淨的方法來做到這一點。這是一個替代方案:

function ElectricCar(listedPrice) { 
    Car.apply(this, arguments); 
} 

ElectricCar.prototype = new Car(); 

請參閱apply瞭解更多詳情。

至於你的最後一個問題(爲什麼不new Car()拋出一個錯誤),因爲其他的答案說,這是一種JavaScript的是如何工作的。如果提供較少的參數比它有參數的函數,所有未設置(這麼說)的參數將被設置爲undefined。爲了證明:

function returnMe(a) { 
    return a; 
} 

console.log(returnMe(5)); 
console.log(returnMe(2+2)); 
console.log(returnMe()); 
console.log(returnMe(undefined)); 

這將返回:

5 
4 
undefined 
undefined 

正如你可以看到undefined實際上是你可以通過周圍(如在returnMe(undefined))的變量。欲瞭解更多信息,請參閱undefined

0

getPrice是這樣的方式在其外部範圍創造了price VAR封閉,有效地使price的私有成員,對於每一個不同的實例獨立,只有這個功能都不能訪問。

構造函數不會拋出錯誤,因爲在JavaScript中爲函數提供參數從不強制。您可以提供儘可能多的,只要有命名參數,首先從您提供的列表中分配給這些名稱。