在JavaScript中定义Universal / Fallback getter属性

时间:2013-02-13 20:02:36

标签: javascript getter

JavaScript拥有Object.defineProperty的getter。所以我可以通过

random的属性window上定义一个getter
Object.defineProperty(window, 'random', {
    get: function () {
        return Math.random();
    }
});

random // Evaluates to a random number

是否可以为给定对象定义“通用getter”,而不管对象属性如何?我希望做一些像

这样的事情
Object.universalGetter(window, function (propertyName) {
     console.log('Accessing property', propertyName, 'of window.');
});

window.Function // Prints "Accessing property Function of window."

我可以在JavaScript中使用“通用getter”吗?

2 个答案:

答案 0 :(得分:11)

不幸的是:不,没有。

在基于Gecko 18的浏览器中引入了一些称为Proxy对象的东西

这将允许你做这样的事情

(function (original, Window) {
  var handler = {
    get: function (target, propertyName) {
      console.log('Accessing property', propertyName, 'of window.');
      return target[propertyName];
    }
  };

  Window = new Proxy(original, handler);


  console.log(Window.setTimeout); 
  // "Accessing property"
  //  "setTimeout"
  //  "of window."

  // function setTimeout() {
  //  [native code]
  // }
})(window);

但这标准且仍然非常不稳定

Btw我原本以为你可以直接在{II}中使用window作为局部变量,但似乎你不能只记录undefined(想知道为什么)所以我把“W”大写了

JSBin

为例

注意:您应该在Firefox中访问它

答案 1 :(得分:5)

没有

在ECMAScript第5版中不可能这样做没有为此操作做准备。虽然没有明确说明,但可以看出[GetProperty]没有任何规定对不存在的财产的规定。

ECMAScript 中的getter / setter需要现有属性,并且没有相应的Ruby method_missing或Python __getattribute__