__defineGetter__ 的简洁替代品?
getter 和 setter 是 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()
访问该值。
Getters and setters are a beauty in VB.Net:
Get
Return width
End Get
Set(ByVal value As Integer)
width = value
End Set
In Javascript, this is probably what we would do:
function Test() {
var width = 100;
this.__defineGetter__("Width", function() {
return width;
});
this.__defineSetter__("Width", function(value){
width = value;
});
}
It looks like a plate of spaghetti ransacked by a kuri. What are some neater alternatives we have?
Note: The new code should access the value using new Test().Width
and not new Test().Width()
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用 ES5,您将能够执行以下操作:
getter/setter 函数当然可以执行您希望它们执行的任何操作。
With ES5 you'll be able to do:
The getter/setter functions can of course do anything you want them to.
这是一个干净的替代方案(也适用于较旧的脚本引擎):
请注意,您不能使用它来定义私有/静态复杂结构。您只能使用此模式“获取”字符串或数字(因此不可变变量)。也许可以使用 json 来增强该模式。
[编辑] 使用 json,您还可以通过这种方式为对象创建 getter:
Here's a clean(er) alternative (also for older script engines):
Mind you, you can't use it to define private/static complex structures. You can only 'get' strings or numbers (so immutable variables) with this pattern. Maybe the pattern can be enhanced using json.
[edit] Using json, you can also create a getter this way for objects:
在 Ecmascript5 中,“干净”(且符合标准)的方法是使用 DefineProperty。
这假设您只想了解如何定义 getter。如果您想做的只是使 Test 的实例不可变(尽可能做到这一点是一件好事),那么您应该使用 freeze 来实现这一点:
In Ecmascript5, the 'clean' (and standards compliant) way of doing this is with defineProperty.
This assumes that you just want to see how to define a getter. If all you want to do is make instances of Test immutable (a good thing to do where you can), you should use freeze for that: