2011-04-20 91 views
1

我试图创建一个变量不能直接从外部变化的单例。这是我现在的代码:使用私有变量创建单例的方法?

var singleton = new (function() { 
    var asd = 1; 
    this.__defineGetter__("Asd", function() { 
     return asd; 
    }); 
})(); 

alert(singleton.Asd) // test 

但是,它看起来像很多丑陋的代码只是为了实现一个简单的事情。

什么是一些更清洁的替代品创建一个单身这样的私人变量?

+1

我没有看到任何文字对象... – Alnitak 2011-04-20 13:33:35

+0

私人静态属性...我不明白。 – Rudie 2011-04-20 13:34:54

+0

@Alnitak,与条款,对象*实例*我的意思搞砸了。 – Pacerier 2014-06-05 06:50:57

回答

1

我想只有关闭可以在JavaScript中带来真正的私有变量。通常我们使用某种命名约定来判断变量是否是私有的。

var TheStaticClass; 

(function() { 
    var a=1; 
    TheStaticClass.__defineGetter__("A", function() { 
    return a; 
    }); 
})(); 

alert(TheStaticClass.A) // test 
2

这又是一个(我不会说少丑)的方式,但现在TheStaticClass.A更像是一个getter方法(优点是它也适用于IE):

var TheStaticClass = new (function() { 
    var a=1; 
    arguments.callee.prototype.A = function() { 
    return a; 
    }; 
})(); 

alert(TheStaticClass.A()) //=> 1 
+0

在IE中有[某些问题](http://kangax.github.com/nfe/#jscript-bugs)与命名函数表达式。 – 2011-04-20 13:45:22

+0

这就是为什么我在匿名函数中将其更改为'arguments.callee'的原因。新!即使更丑陋! – KooiInc 2011-04-20 13:49:22

+0

显然,我在写评论时没有看到这种变化。当有人直接在代码中使用'strict strict'时,你的新函数甚至会触发异常。 – 2011-04-20 13:55:04

3
var theStaticClass = (function() { 
    var a = 7; 
    return { get A() { return a; } }; 
})(); 

console.log(theStaticClass.A); 
+1

IE9:'Expected':'' – KooiInc 2011-04-20 13:41:23

+0

@Kooilnc,我该如何删除IE9的错误?代码有什么问题? – dheerosaur 2011-04-20 13:46:08

+2

你不能。 IE不支持getter/setter。 '__defineGetter__'语法也是一个nogo与IE – KooiInc 2011-04-20 13:48:20

2

假设你需要在返回前做一些修改变量:

var theStaticClass = (function() { 
    var a = 7; 
    return {A: (function(b){ 
     return b * b; 
    })(a)}; 
})(); 
console.log(theStaticClass.A); // => 49 
相关问题