12

JavaScript 有带有Object.defineProperty. 所以我可以在by的属性random上定义一个 getterwindow

Object.defineProperty(window, 'random', {
    get: function () {
        return Math.random();
    }
});

random // Evaluates to a random number

无论对象属性如何,是否可以为给定对象定义“通用吸气剂”?我想做类似的事情

Object.universalGetter(window, function (propertyName) {
     console.log('Accessing property', propertyName, 'of window.');
});

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

我可以在 JavaScript 中做“通用吸气剂”吗?

4

2 回答 2

16

不幸的是:不,没有。

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

这将允许你做这样的事情

(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);

但这不是标准的,仍然非常不稳定

顺便说一句,我最初认为您可以直接window在 IIFE 中用作局部变量,但似乎您不能只记录未定义的日志(想知道为什么),所以我将“W”大写

这是一个关于JSBin的例子

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

于 2013-02-14T08:15:32.727 回答
7

不。

在 ECMAScript 第 5 版中无法执行此操作,因为没有此操作的规定。虽然没有明确说明,但可以看出[GetProperty]没有为不存在的属性做出任何规定。

ECMAScript 中的 getter/setter需要现有的属性,并且没有 Rubymethod_missing或 Python 的__getattribute__.

于 2013-02-13T20:11:29.663 回答