如何在创建对象后对变量使用get运算符?

时间:2011-02-02 16:03:21

标签: javascript variables object

我最近问了一个问题here,我发现我可以使用{get a(){return' whatev'}}来控制变量获取和设置时会发生什么。

我想知道在创建变量之后我是否可以做到这一点,就像这样,除了这不起作用:

abc=new Object();
abc._a = NaN;
abc.get a() {
return abc._a;
}
abc.set a(i) {
abc._a=i;
}

在另一个问题中,它只显示了在制作新对象时如何做到这一点:

abc = {
  _a:NaN;
  get a() {
    return _a;    
    }
  set a(i) {
    _a=i;
    }
  }

修改 我找到了' defineGetter '和' defineSetter '在https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineGetter,它有效,但它表示它是非标准的。有更标准的方法吗?

3 个答案:

答案 0 :(得分:2)

getset是对象初始值设定项的一部分。它们不是对象的属性,因此不能在以后添加。

有关详细信息,请参阅ECMAScript 1.5, Section 11.1.5 Object Initializer

答案 1 :(得分:1)

只有ES5(ECMAScript版本5)才支持getter和setter。不幸的是,ES5尚未完全由任何浏览器实现,只是部分实现。

当前的Javascript实现不支持getter和setter,不支持标准或跨浏览器方式。你必须编写显式的getA和setA函数,抱歉。

这是ES3中的推荐方式(适用于所有现代浏览器,即使在IE6中),使用闭包:

var abc = (function () {
  var a = NaN;
  return {
    getA: function () {
        return a;
    },
    setA: function (value) {
        a = value;
    }
  };
})();

这将在变量abc中为您提供一个对象,其中包含两个函数:getA()setA(value)。获得a的唯一方法是通过这两种方法。

abc.getA()
// NaN

abc.setA(25);
abc.getA();
// 25

a变量本身对外界是隐藏的,因为它只存在于用于创建对象的匿名函数的范围内。

答案 2 :(得分:1)

大多数浏览器都支持非标准__defineGetter____defineSetter__(Mozilla,WebKit和Opera,但不支持IE)。他们会按照您的意愿行事并且是最受支持的选项(不能用明确的getX()setX()方法替换您的财产。例如:

var o = {};
o._a = "foo";

o.__defineGetter__("a", function() {
    return this._a;
});

o.__defineSetter__("a", function(val) {
    return this._a = val;
});

alert(o.a);  // "foo"
o.a = "bar";
alert(o._a); // "bar

更新

注意,现在正确的方法是使用Object.defineProperty或Object.defineProperties。