2014-03-31 69 views
0

我只是嘗試覆蓋Car類中的字段和函數。如何覆蓋現有的字段和函數?覆蓋公用字段javascript原型

Car = function() 
{ 
    this.doors = null; 
    this.open = function(){alert("open it!");} 
} 

Car.prototype.doors = 4; 

Car.prototype.open = function(){ // public method 
    alert("do not open!"); 
} 

myCar = new Car(); 
alert(myCar.doors); //null? 

回答

1

請參閱,prototype是不是一些魔術技巧,允許您擴展一個對象。它唯一的目的是爲相應對象中找不到的屬性提供值。這裏,doorsopen都是針對Car對象定義的,這就是爲什麼查找甚至不會達到Car.prototype

而這容易證明:只要這些行添加到您的代碼

delete myCar.doors; 
alert(myCar.doors); // 4 

說明:與delete myCar.doors相應的屬性是從對象中刪除。當你查找其下一行的值,它會檢查原型鏈,達到Car.prototype.doors - 其值設置爲4

這就是爲什麼,順便說一句,prototype chain很少用於特定設置靜態值類。但是它對設置所謂的類方法非常有用,因爲只有一個函數的副本將被創建並存儲在內存中。

+0

但如果重新寫入? http://jsfiddle.net/UJy2g/ – MackieeE

+0

是的,除非對象的屬性被定義爲「只讀」,否則您可以自由地爲其分配任何值。 – raina77ow

+0

@ raina77ow所以原型是有附加,不擴展 – bergman