【发布时间】:2014-12-30 01:29:51
【问题描述】:
看了一本《Essential JS Design Patterns》一书,无法理解这段代码中私有变量的行为:
var SingletonTester = (function () {
// options: an object containing configuration options for the singleton
// e.g var options = { name: "test", pointX: 5};
function Singleton( options ) {
// set options to the options supplied
// or an empty object if none are provided
options = options || {};
// set some properties for our singleton
this.name = "SingletonTester";
this.pointX = options.pointX || 6;
this.pointY = options.pointY || 10;
}
// our instance holder
var instance;
// an emulation of static variables and methods
var _static = {
name: "SingletonTester",
// Method for getting an instance. It returns
// a singleton instance of a singleton object
getInstance: function( options ) {
if( instance === undefined ) {
instance = new Singleton( options );
}
return instance;
}
};
return _static;
})();
var singletonTest = SingletonTester.getInstance({
pointX: 5
});
// Log the output of pointX just to verify it is correct
// Outputs: 5
console.log( singletonTest.pointX );
这是本书中关于单例模式的示例。
有一个匿名函数,它返回一个包含“name”成员的对象和用于返回“Singleton”函数实例的“getInstance”方法。
我的麻烦是了解存储在 SingletonTester 中的对象如何访问“实例”私有变量。我的意思是,在匿名函数完成其工作后,SingletonTester 变量应该只保存对象:
{
name: "SingletonTester",
// Method for getting an instance. It returns
// a singleton instance of a singleton object
getInstance: function( options ) {
if( instance === undefined ) {
instance = new Singleton( options );
}
而且这个对象不知道实例是什么。 “单例”函数的实例化也是如此。它是如何知道定义在匿名函数范围内的“Singleton”是什么函数?
【问题讨论】:
-
看起来只是变量作用域,
instance在类函数内部定义高于getInstance(),所以它在它下面的任何作用域中都可用,但在它上面不可用,所以它在getInstance()内部可用但不在 IIFE 之外,除非在公开变量时调用getInstance()。
标签: javascript