2015-06-28 116 views
1

,我有以下的代碼定義一個單例:參考這個工作不

var S = (function() { 
    this._enabled = false; 

    this.initialize = function() { 
     this._doit(); 
    }; 

    this._doit = function() { 
     this._enabled = true; 
    }; 

    // Exporting 
    return { 
     Initialize: this.initialize 
    }; 
})(); 

我打電話:

S.Initialize(); 

而得到這樣的:

「this._doit '不是功能

如果我只是撥打電話_doit()initialize那麼就沒問題......但我想我確實設置了this,可以在我班的所有元素中使用。

我在做什麼錯?由於

回答

1

對於你在做什麼這裏我會避免this完全,如:

var S = (function() { 
    var _enabled = false; 

    function initialize() { 
     _doit(); 
    }; 

    function _doit() { 
     _enabled = true; 
    }; 

    // Exporting 
    return { 
     Initialize: initialize 
    }; 
})(); 

因爲你不使用new關鍵字,thiswindow對象(或在嚴格模式它將參考undefined)。另一種選擇是使用new function(),例如:

var S = new function() { 
    this._enabled = false; 

    this.initialize = function() { 
     this._doit(); 
    }; 

    this._doit = function() { 
     this._enabled = true; 
    }; 
}; 

S.initialize(); 
+0

好的,如果我想要'_doit'是私人的呢? – Andry

+0

在我的第一個示例中,除「Initialize」方法之外的所有內容都是私有的。 –

+0

啊你是對的! – Andry

2

因爲你是返回包含初始化指向this的初始化函數在施工,這將可能是window時的對象。

你要做到以下幾點:

var S = (function() { 
    return { 
    _enabled : false, 

    Initialize : function() { 
     this._doit(); 
    }, 
    _doit : function() { 
     this._enabled = true; 
    } 
    }; 
})(); 

S.Initialize(); 

這是一個非常,非常不同的事情。

編輯:,如果你想保持_doit()真正私有的,你可以代替寫:

var S = (function() { 
    var s = { 
    _enabled : false, 

    initialize : function() { 
     _doit(); 
    }, 
    }; 

    var _doit : function() { 
     s._enabled = true; 
    }; 
    return s; 
})(); 

s成爲你的對象和功能的關閉其私人方面的公衆形象。

+0

如果我想讓'_doit'保密? – Andry

+0

@Andry - 請參閱編輯。 – Malvolio

2

this.initialize = function() { 
    this._doit(); 
}; 

thisinitialize對象,所以你正在做的是: this.initialize._doit(),即不存在。

嘗試保存this上下文到本地變量並使用該變量。

var S = (function() { 
    var _this = this; 
    this._enabled = false; 

    this.initialize = function() { 
     _this._doit(); 
    }; 

    this._doit = function() { 
     _this._enabled = true; 
    }; 

    // Exporting 
    return { 
     Initialize: this.initialize 
    }; 
})(); 
+0

將''this'別名'_this'在這裏沒有幫助,因爲'this'是指'window'。爲了使'this'正確工作,您需要使用'new'關鍵字,或者將所有內容放入對象字面值中,如@ Malvolio的答案中所示。否則,你正在'window'對象上設置全局屬性! –