吸气剂和二传手是VB.Net的美女:
Get
Return width
End Get
Set(ByVal value As Integer)
width = value
End Set
在Javascript中,这可能就是我们要做的事情:
function Test() {
var width = 100;
this.__defineGetter__("Width", function() {
return width;
});
this.__defineSetter__("Width", function(value){
width = value;
});
}
看起来像是一块由kuri洗劫的意大利面。我们有什么更整洁的选择?
注意:新代码应使用new Test().Width
而非new Test().Width()
访问该值。
答案 0 :(得分:11)
使用ES5,您将能够:
function Test() {
var a = 1;
return {
get A() { return a; },
set A(v) { a = v; }
};
}
getter / setter函数当然可以执行任何您想要的操作。
答案 1 :(得分:9)
这是一个干净的(呃)替代方案(也适用于旧的脚本引擎):
function Test() {
var a=1;
return { A: { toString: function(){return a;} } };
}
alert(Test().A); //=> 1
请注意,您无法使用它来定义私有/静态复杂结构。您只能使用此模式“获取”字符串或数字(因此是不可变变量)。也许可以使用json增强模式。
[编辑]使用json,您还可以通过这种方式为对象创建一个getter:
function Test() {
var a=1,
b = {foo:50, bar:100};
return {
A: { toString: function(){return a;} }
foobar: { toString: function(){return JSON.stringify(b);} }
};
}
var foobar = JSON.parse(Test().foobar);
alert(foobar.foo); //=> 50
答案 2 :(得分:6)
在Ecmascript5中,“clean”(和标准兼容)方式是使用defineProperty。
function Test() {
var a = 1;
Object.defineProperty(this, "A", {get : function() {
return a;
},
enumerable : true});
}
这假设你只想看看如何定义一个getter。如果你想做的只是让Test不可变的实例(你可以做的好事),你应该使用冻结:
function Test() {
this.a = 1;
Object.freeze(this);
}