12

JavaScriptには。付きのゲッターがありObject.definePropertyます。randomだから私はのプロパティでゲッターwindowを定義することができます

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

残念ながら: いいえ、ありません。

Proxy Objects Introduced in 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);

しかし、これは標準ではなく、まだ非常に不安定です

ところで、もともとIIFEでローカル変数として直接使用できると思ってwindowいましたが、未定義のログを記録することはできないようです(なぜだろうか)ので、「W」を大文字にしました

JSBinの例を次に示します。

注: Firefox でアクセスする必要があります。

于 2013-02-14T08:15:32.727 に答える
7

いいえ。

この操作のプロビジョニングがないため、ECMAScript第5版では実行できません。そのようなことは明確に述べられていませんが、 [GetProperty]は存在しないプロパティを規定していないことがわかります。

ECMAScriptのゲッター/セッターには既存のプロパティが必要であり、Rubymethod_missingまたはPythonに相当するものはありません__getattribute__

于 2013-02-13T20:11:29.663 に答える