2015-04-01 74 views
0

我有一個關於自定義函數的問題。自定義函數的屬性在哪裏?

var scareMe = function(){ 
    console.log("Boo!"); 
    var instance = this; 
    scareMe = function(){ 
    console.log("Double Boo!"); 
    return instance; 
    } 
} 
scareMe.prototype.nothing = true; 
var un1 = new scareMe(); 
console.log(un1.nothing); //true 
scareMe.prototype.everything = true; 
var un2 = new scareMe(); 
console.log(un1 === un2); //true 

它按我的預期工作。

console.log(un2.everything); //undefined 

我在哪裏可以得到'一切'屬性?

+0

請注意,此處只創建一個實例,第二次調用* scareMe *將返回對第一次調用中創建的同一對象的引用(通過閉包到*實例*),所以* un1 *和* un2 *引用同一個對象,因此爲什麼'un1 === un2'是真的。 – RobG 2015-04-01 05:57:43

回答

2

它不會工作,因爲一旦scareMe叫,你要重寫scareMe另一個功能,當您嘗試實際上改變的是第二種方法的原型不是第方法的初始調用後更改原型與您創建了該實例。所以原型的更改不會反映在您的實例中。


一種可能的解決方案是覆蓋第二物體的原型與第一個

var scareMe = function() { 
    console.log("Boo!"); 
    var instance = this, 
     proto = scareMe.prototype; 
    scareMe = function() { 
     console.log("Double Boo!"); 
     return instance; 
    } 
    scareMe.prototype = proto; 
} 
scareMe.prototype.nothing = true; 
var un1 = new scareMe(); 
console.log('nothing', un1.nothing); //true 
scareMe.prototype.everything = true; 
var un2 = new scareMe(); 
console.log(un1 === un2); //true 
console.log('everything', un1.everything); //true 

演示:Fiddle


另一種方式寫入相同的可以是像

var scareMe = (function() { 
    var instance; 
    return function() { 
     if (instance) { 
      return instance; 
     } 
     instance = this; 

    } 
})(); 

演示:Fiddle