__defineGetter__ 的简洁替代品?

发布于 2024-11-02 15:22:13 字数 561 浏览 2 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

倚栏听风 2024-11-09 15:22:13

使用 ES5,您将能够执行以下操作:

function Test() {
  var a = 1;

  return {
    get A() { return a; },
    set A(v) { a = v; }
  };
}

getter/setter 函数当然可以执行您希望它们执行的任何操作。

With ES5 you'll be able to do:

function Test() {
  var a = 1;

  return {
    get A() { return a; },
    set A(v) { a = v; }
  };
}

The getter/setter functions can of course do anything you want them to.

╰ゝ天使的微笑 2024-11-09 15:22:13

这是一个干净的替代方案(也适用于较旧的脚本引擎):

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

Here's a clean(er) alternative (also for older script engines):

function Test() {
  var a=1;
  return { A: { toString: function(){return a;} } };
}

alert(Test().A); //=> 1

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:

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
寄意 2024-11-09 15:22:13

在 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);
}

In Ecmascript5, the 'clean' (and standards compliant) way of doing this is with defineProperty.

function Test() {
    var a = 1;
    Object.defineProperty(this, "A", {get : function() { 
            return a;
        },  
        enumerable : true});
}

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:

function Test() {
    this.a = 1;
    Object.freeze(this);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文