15

プロトタイプのデフォルトのゲッターを指定するにはどうすればよいですか? デフォルトのゲッターとは、呼び出された場合に呼び出される関数を意味しますobj.undefinedProperty123

Object.prototype.get = function(property) {..} を試してみましたが、この場合は呼び出されません。

4

8 に答える 8

12

ECMAScript 5 では、特定の名前付きプロパティ (普遍的にすべてのプロパティではない) に対する get/set 操作のみを次の方法でインターセプトできますObject.defineProperty

Object.defineProperty(someObj, "someProp", {
    get: function() {
        console.log("you tried to get someObj.someProp");
        return "foo";
    }
});

ここでは、getコードが を読み取ろうとするたびに関数が実行されますsomeObj.someProp

今後の ECMAScript 6 ドラフトでは、これはプロキシ経由で可能になります。プロキシには、基礎となるターゲット オブジェクトと set/get 関数があります。プロキシのプロパティのいずれかで set または get 操作が発生すると、適切な関数が実行され、プロキシのターゲット オブジェクト、使用されるプロパティ名、およびset試行で使用される値が引数として取られます。

var proxyHandler = {
    get: function(obj, name){
        console.log("you're getting property " + name);
        return target[name];
    },
    set: function(obj, name, value) {
        console.log("you're setting property " + name);
        target[name] = value;
    }
}

var underlyingObj = {};

// use prox instead of underlyingObj to use get/set interceptor functions
var prox = new Proxy(underlyingObj, proxyHandler);

ここで、プロパティ値を取得するように設定するproxと、set/get関数が実行されます。

于 2014-09-29T17:18:07.533 に答える
4

ガレスが言ったこと、それ以外は__noSuchMethod__.

それとも、PHP のことを考えていたのでしょうか。

これは、最近標準化されたプロパティの getter/setter に関する非常に優れた記事で、以前の非標準の具体化を強調しています。

http://whereswalden.com/2010/04/16/more-spidermonkey-changes-ancient-esoteric-very-rarely-used-syntax-for-creating-getters-and-setters-is-being-removed/

要約: 標準の「すべてをキャッチする」getter/setter は (まだ) ありませんが、Object.defineProperty は将来のものです。

于 2010-07-05T06:29:50.757 に答える
4

まさにこれを行うように設計された ECMA6「プロキシ」システムの実装を待つ必要があります。http://wiki.ecmascript.org/doku.php?id=harmony:direct_proxiesを参照してください。

于 2012-12-18T06:32:56.460 に答える
1

Firefox では非標準の noSuchMethod で可能です:-

({__noSuchMethod__:function(){alert(1);}}).a();
于 2010-06-24T22:14:37.743 に答える
0

あなたが何を求めているのかわかりません。ただし、ユーザーがAccessを試行したときにメソッドが呼び出されるようにする場合object.nonExistingProperty。私はそれをする方法はないと思います。

于 2010-06-24T18:30:33.727 に答える