是否有任何模式可以用来在调用时计算变量(如c#中的属性)
var A = (function() {
var self = {};
var a = 0;
self.x = function (){
a = a+1;
return a;
};
return self;
});
通常,调用将是:
var bla = A.x();
,但我想评估它,并得到它的值作为一个属性:
var bla = A.x;
console.log(bla); // prints "1"
我不需要()操作符,但我仍然想计算/计算属性值,当我访问A.x
你一定是在说getter和setter。
当你读取(get)或赋值(set)对象属性时,这些函数会在"幕后"被调用。
它们都很标准(IE>=9),但是语法有点复杂。
看:
https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/defineProperty
一个(详细)示例,实现由变量支持的属性:
var A = (function() {
var self = {};
var x = 0;
var xPropertyDescriptor = { enumerable : true ,
get : function() { return x },
set : function(val) { x=val } };
Object.defineProperty(self, 'x', xPropertyDescriptor);
return self;
} () );
在调用defineProperty之后,您可以像访问常规属性一样访问'x',并且会调用get或set函数。
所以基本上,写入:
A.x = 12 // will call the getter : function(12) { x=12 }, and set the variable.
注意,你可以在原型上定义getter/setter,以便以后更有效地创建对象(否则你必须在每个实例的构造函数中定义它们)。
然而,在构造函数中定义属性是使用闭包(如上面的例子)拥有真正私有成员的唯一方法。
使用中:
var res = A.x ; // res == 0
A.x = 12 ;
var res2 = A.x // res2==12
是的,你可以使用
var bla = A.x;
console.log(bla());
//or
console.log(bla.call());
还有几个选项,但这些是最简单的。
在Ecmascript5中,有一个defineProperty
方法可以用来定义属性的getter和setter。
看看这个:http://robertnyman.com/javascript/javascript-getters-setters.html
因此,正如链接的示例中详细介绍的那样,您可以这样定义getter/setter:var myTest = {
val : "Initial Value",
get value () {
return this.val + " Modified";
},
set value(newVal) {
this.val = newVal;
}
};
myTest.value // "Initial Value Modified"
myTest.value = "foo"
myTest.value // "foo Modified"
好运。
PS:您应该记住这可能带来的兼容性问题。请阅读链接,您将在那里找到详细信息。