JavaScript是动态的。很酷!
我有以下构造函数:
function Preferences () {
this._preferences = {}
}
var obj = new Preferences()
我想实现这样的目标:
>>> obj.something = 'value'
>>> this._preferences['something']
'value'
即设置obj
的属性并不实际设置它自己的属性,而是设置obj._preferences
的属性。我希望覆盖默认行为。
有可能吗?
编辑:我想为所有属性名称实现此目的,即要设置的属性的名称尚不清楚。
答案 0 :(得分:4)
Object.defineProperty(Preferences.prototype, 'something', {
get: function(){
return this._preferences.something;
},
set: function(value){
this._preferences.something = value;
}
});
应该这样做。它使用访问者属性而不是数据属性定义了一个属性“'”,并将调用“get'和'设置'用于确定访问.something
时执行此操作的功能。
答案 1 :(得分:0)
使用Proxy对象可以执行类似的操作并处理运行时定义的属性
function Preferences() {
this._preferences = {};
var prefProxy = new Proxy(this, {
get: function(target, property) {
return property in target?
target[property]:
target._preferences[property];
}
set: function(target, property, value, receiver) {
if(property in target){
target[property] = value;
} else {
target._preferences[property] = value;
}
}
});
return prefProxy;
};
我可能错了,但我认为你要问的是回复_preferences
function Preferences () {
this._preferences = {};
return _preferences;
}
var obj = new Preferences()
使用getter和setter,您可以将属性重定向到_preferences
function Preferences () {
this._preferences = {}
Object.defineProperty(Preferences.prototype, 'something', {
get: function() {
return this._preferences['something'];
},
set: function(value) {
this._preferences['something'] = value;
}
});
}
var obj = new Preferences()