2015-09-20 83 views
1

我不是很明白,爲什麼我會在第一個日誌消息Prototype: [object Object]中獲得,第二個是Prototype: New Plant爲什麼我不能覆蓋類(函數)描述中的方法定義?

function Plant() { 
this.toString = function() { 
     return "Plant"; 
    } 
} 

function Fruit(name) { 
    Plant.call(this); 
    this.name = name; 
    this.toString = function() { 
     return "Fruit"; 
    } 
} 
Fruit.prototype = Object.create(Plant.prototype);  
var apple = new Fruit("apple"); 

console.log("Prototype: " + Object.getPrototypeOf(apple)); 
Plant.prototype.toString = function() { 
    return "New Plant"; 
} 
console.log("Prototype: " + Object.getPrototypeOf(apple)); 

我想,既然我在工廠類中定義的toString()方法,所有的水果情況下會有這種方法呢?

回答

1

您所有的Fruit實例都可以訪問Plant原型上的.toString()方法。但是,通過在Fruit構造函數中直接賦值,該方法是覆蓋。一旦Fruit構造函數將某些內容分配給this.toString,這將始終隱藏原型鏈中的.toString()

請記住,在Fruit構造函數的代碼中,this引用了新創建的實例。因此,this屬性的賦值是直接存在於每個實例上的屬性。

在像x.toString()這樣的表達式中,搜索名稱爲「toString」的屬性從對象本身開始。如果它在那裏被發現,那麼就不會諮詢原型鏈。

現在,至於其他的問題,爲什麼你console.log()報表打印他們會怎麼做,請注意第一調用發生你把.toString()方法對植物原型之前。一旦完成了這一步,console.log()調用中+表達式中發生的從對象到字符串的轉換將隱式調用該函數以將原型對象轉換爲字符串。

+0

非常感謝您的迴應!但是,如果我從Fruit函數中刪除了toString()描述,我仍然在Object.getPrototypeOf(apple)的第一次調用 - 它的原型:[object Object]上有相同的響應。 不應該是「植物」,因爲搜索將遵循從水果到植物的原型鏈,並且我必須在植物功能中使用toString()? –

+0

@AntonPoliakov是的 - 因爲你用'+'運算符使用'Object.getPrototypeOf(apple)',並且Object原型函數的默認'.toString()'將被調用,並返回'[object Object ]'。請記住,原型對象是*自身*對象,並且* prototype *對象中唯一可以使用的'.toString()'是'Object.prototype'上的對象。 Fruit *實例獲得'.toString()'函數並不重要。 – Pointy

+0

明白了。再次感謝! –

相關問題