我最近问了一个问题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,它有效,但它表示它是非标准的。有更标准的方法吗?
答案 0 :(得分:2)
get
和set
是对象初始值设定项的一部分。它们不是对象的属性,因此不能在以后添加。
有关详细信息,请参阅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。