2011-10-06 46 views
1
function Person(){ 
    this.scream = function(){ 
     alert('NO NO NO!!!!'); 
    }; 
} 

var steve = new Person(); 
steve.scream() // NO NO NO!!!! 
Person.prototype.scream = function(){ 
    alert('YES YES YES!!!!'); 
} 
steve.scream() // still NO NO NO!!!! 

有沒有辦法覆蓋「尖叫」沒有明確引用史蒂夫?想想當你有可能的情況下javascript:如何覆蓋某個類的所有實例的方法?

回答

2

沒有,

有了這樣的Person聲明,每次創建一個新的「實例」它的「構造」將運行,你會創造一個全新的scream功能(關閉),你除了新創建的對象steve.scream之外沒有任何引用。

作爲替代,你可以做這樣的:

function Person(){} 

Person.prototype.scream = function(){ 
    alert('NO NO NO!!!!'); 
} 

var steve = new Person(); 
steve.scream() // NO NO NO!!!! 
Person.prototype.scream = function(){ 
    alert('YES YES YES!!!!'); 
} 
steve.scream() // this time is YES YES YES!!!! 

在這種情況下,初始scream「辦法」僅適用於一個地方,在原型,可以覆蓋其所有的「實例」。

1
function Person(){}; 
Person.prototype.scream = function(){ alert('NO NO NO!!!!'); }; 
var steve = new Person(); 
steve.scream(); 
Person.prototype.scream = function(){alert('YES YES YES!!!!');}; 
steve.scream(); 
0

,如果你想繼續使用您的代碼風格,你可能會喜歡

function Person(){ 
    this.constructor.prototype.scream = function(){ 
     alert('NO NO NO!!!!'); 
    }; 
} 
var steve = new Person(); 
steve.scream(); 
Person.prototype.scream = function(){ alert('YES YES YES!!!!'); }; 
steve.scream(); 
+0

這是不同的BTW,可能是錯誤的,因爲構造函數鏈將改變你的原型 – 2011-10-06 11:22:55

+0

此外,進入封閉已損壞。尖叫函數對所有實例都是通用的,而閉包應該是每個實例。 – viebel