__defineGetter__的简洁替代方案
Neat alternatives to __defineGetter__?
getter和setter在VB中是一个美丽的东西。净:
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()
访问值
使用ES5,您将能够:
function Test() {
var a = 1;
return {
get A() { return a; },
set A(v) { a = v; }
};
}
getter/setter函数当然可以做任何你想让它们做的事情。
这里有一个干净的(er)替代方案(也适用于旧的脚本引擎):
function Test() {
var a=1;
return { A: { toString: function(){return a;} } };
}
alert(Test().A); //=> 1
注意,你不能用它来定义私有/静态的复杂结构。你只能用这个模式"获取"字符串或数字(所以不可变的变量)。也许该模式可以使用json.
来增强。[edit]使用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
在Ecmascript5中,"干净"(并且符合标准)的方法是使用defineProperty。
function Test() {
var a = 1;
Object.defineProperty(this, "A", {get : function() {
return a;
},
enumerable : true});
}
这里假设你只是想看看如何定义getter。如果您想要做的只是使Test的实例不可变(在可能的情况下这样做是件好事),那么您应该使用freeze:
function Test() {
this.a = 1;
Object.freeze(this);
}
相关文章:
- 轻量级zxcvbn替代方案
- 正在寻找比$(document).ready慢的$(window).load的替代方案
- ng映射方向备选方案
- 为什么$.brower被弃用?还有什么更好的替代方案
- 执行php函数的onclick事件的其他替代方案
- Android上URL方案的替代方案
- :not选择器不适用于ul类-备选方案
- 可以转换显示属性吗?如果没有,什么'这是最好的解决方案
- iPad虚拟键盘-哪一个-javasctript解决方案
- jqlite中.first()的替代方案
- AJAX HTTP基本身份验证解决方案
- 在chrome web商店中打开时,是否有允许执行内容/后台脚本的解决方案
- Chart.js-添加渐变而不是纯色-实现解决方案
- learnyounode杂耍异步解决方案不工作
- 想在jquery中设计一个配色方案
- 在 JavaScript 数组中的所有元素之间穿插元素的简洁方法
- 在lodash上有没有一个替代方案.merge.apply(_,x);其中x是对象的数组
- 了解因子分解解决方案
- 对于这个条件语句有没有更简洁的解决方案
- __defineGetter__的简洁替代方案