2009-04-15 82 views
7

當我遇到原型的概念時學習JavaScript。我成功地向類別類添加了新方法,但未能覆蓋原來的說話方法JavaScript原型函數不覆蓋原始函數

function cat(name) { 
    this.name = name; 
    this.talk = function() { 
     alert(this.name + " : I'm a girl!") 
    } 
} 

cat.prototype.talk = function() { 
    alert(this.name + " : I'm a dude!") 
} 

cat1 = new cat("felix") 
cat1.talk() 

爲什麼不提示新文本?

回答

16

'功能貓'只是一個功能。它的原型是一個空的對象({})。可以調用'新貓'將成員的名字和談話添加到新的對象中。在這個新對象下面是函數原型,它仍然是{}。

var c= new cat('Tiddles'); 

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} } 
c inherited: {} 

現在,當你寫「cat.prototype.talk」,要添加成員,而該標的物:

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} } 
c inherited: { 'talk': function() {...} } 

的「對話」功能上直接設置實例「C」需要優先於在c的構造器原型上間接設置的'說話'。

所以你在這裏混合了兩種風格的繼承,'this'分配方法和'prototype'方法。

向原型寫入方法的優點是,不會將相同成員的冗餘副本複製到每個對象實例中;寫入實例具有解決綁定方法問題的優點。你選擇哪一個取決於你,但不要混合這兩者。如果你想去原型路線,只有'名字'應該被寫入'this',因爲這是每個實例特有的唯一屬性。

7

附加在開頭的函數附加到對象(每個實例1個函數)。另一個連接到原型(1個功能由所有實例共享)。

對象級別的成員覆蓋原型級別的成員。