我想为我正在编写的类创建一个python样式的getattr
函数,以便它可以响应某个属性的请求并做出相应的反应。我知道你可以写一个习惯性的" getter"对于使用Object.defineProperty
的商标:
var foo = {bar: 1, baz: 2}
Object.defineProperty(foo, 'qux',
{
get: function(){
console.log('you asked for qux!');
return 5;
}
});
foo.qux // prints 'you asked for qux!', returns 5
我想知道,有没有办法为任意键执行此操作,以便您可以根据他们的要求做一些逻辑?例如
Object.defineGetter(foo, function(key) {
console.log('ah, you asked for ' + key);
if (key[0] === 'a') {
return 0;
} else {
return 1;
}
foo.apple // prints 'ah, you asked for apple', returns 0
foo.orange // prints 'ah, you asked for orange', returns 1
JavaScript中是否有这样的功能?
答案 0 :(得分:0)
使用Function.prototype.bind
:
var obj = {
prop1: undefined,
prop2: undefined
};
function defineGetter(obj, callback) {
Object.keys(obj).forEach(function (key) {
Object.defineProperty(obj, key, {
get: callback.bind(obj, key)
});
});
}
defineGetter(obj, function (key) {
if (key === "prop1") {
return 0;
} else if (key === "prop2") {
return 1;
}
});
console.log(obj.prop1); // => 0
console.log(obj.prop2); // => 1
为obj
的每个可枚举属性创建一个getter,其中getter的第一个参数预先填充了所访问属性的键。
唯一的缺点是,以后添加到对象的任何属性都不会有魔法吸气剂。