像Object.defineProperty这样的函数在javascript中创建一个通用的getter / setter?

时间:2014-04-18 23:18:33

标签: javascript

我想为我正在编写的类创建一个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中是否有这样的功能?

1 个答案:

答案 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

http://jsfiddle.net/myXYU/2/

obj的每个可枚举属性创建一个getter,其中getter的第一个参数预先填充了所访问属性的键。

唯一的缺点是,以后添加到对象的任何属性都不会有魔法吸气剂。