在js中解决getter的丑陋语法

时间:2012-03-19 21:00:06

标签: javascript closures

让我们来看看这个对象:

var person = {
    _name: "John",
    name: function() {return _name}
}

在GUI中,

myTextBox.value = person.name()

将返回

"John"

但是

myTextBox.value = person.name

将返回

function() {return _name}

如何强制两种语法都返回"John"?我可以在某种程度上使用闭包(question I asked previously)吗?

3 个答案:

答案 0 :(得分:2)

如果您只支持现代浏览器,则可以使用ES5 Getters,但通常这是JavaScript,为什么要让它变得复杂?

您的替代方案是:

  1. 制定规则,您必须使用该功能来访问变量(yuck)
  2. 不要担心。
  3. 我会去#2。

    我认为你在这里对这个语法感到困惑,但实际上它和你现在有同样的问题:

    function Person(name) {
     this._name = name;   
    }
    Person.prototype.name = function(name) {
      if (name) this._name = name;
      return this._name;
    }
    var j = new Person("Jay");
    j.name() // "Jay"
    j.name("Thomas"); // I can set the value as well
    j.name() // "Thomas"
    

    您似乎正在尝试创建真正的私有变量,这些变量是可能的,但可能没那么有用。

    function Person(name) {
      var myName = name; // private
      this.name = function() {
        return myName;
      }
    }
    var j = new Person("Jay");
    j.name(); // still had to use perens
    

    最后,因为你的只是一个简单的对象,我们可以做到这一点。不知道你为什么要这样做:

    var person = {};
    (function(name) {
      var myName = name; // myName and name, both private, but not helpful
      person = {
        name = myName
      }
    }("Jay"))
    person.name // "Jay"
    

答案 1 :(得分:1)

你不能!

  • 您无法覆盖javascript运算符或关键字。
  • 你真的不能拥有一个在同一个环境中做两件不同事情的operator \ _关键字!

答案 2 :(得分:1)

好的,有一个游戏,看起来这是“可能的”(至少在Chrome中),但它有点肮脏的黑客。

var person = {
   _name: "John",
   name: function() {return this._name;},
}
person.name.toString = function(){ return person._name; }

这将导致person.name和person.name()返回“John”。