Mat*_*ner 5 javascript getter setter defineproperty
可以使用覆盖特定属性的JavaScript getter和setter Object.defineProperty.有没有办法访问默认的getter/setter(即如果getter/setter没有被覆盖则使用的函数)?在我的自定义setter中,我想在某些情况下进行特殊处理,但在其他情况下使用默认处理.我试过了:
Object.defineProperty(obj, 'foo',
'set': function(val) {
if (useCustom) {
doCustomProcessing(obj, 'foo', val);
}
else {
obj['foo'] = val;
}
}
);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会导致堆栈溢出,因为obj['foo'] = val;会导致调用自定义setter.所以我想找到一种方法来设置使用默认setter 的foo属性obj.这可能吗?
据我所知,属性要么具有值(数据属性),要么具有getter/setter(访问器属性):它不能同时具有这两者.在闭包或其他属性下使用局部变量作为已定义getter/setter的属性的基础存储.
例如,
(function() {
var value;
Object.defineProperty(obj, 'foo', {
set: function(val) {
if (useCustom) {
value = doCustomProcessing(obj, 'foo', val);
} else {
value = val;
}
},
get: function() { return value; }
});
})();
Run Code Online (Sandbox Code Playgroud)
在 ES6 中,您可以使用Proxy 对象:
var myObject = {};
var myProxyObject = new Proxy(myObject, {
set: function(ob, prop, value) {
if (prop === 'counter' && value === 10) {
// Some specialised behaviour
ob.counter = 0;
}
else {
// Default setter behaviour.
ob[prop] = value;
}
// Return true otherwise you will get a TypeError in strict mode.
return true;
}
});
>>> myProxyObject.counter = 5;
>>> console.log(myProxyObject.counter);
5
>>> myProxyObject.counter = 10;
>>> console.log(myProxyObject.counter);
0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2210 次 |
| 最近记录: |