0

私はこれをどこかで見たことがあると確信しています。プロトタイプを見始めたばかりなので、よくわかりません。

変数のすべての要求をキャッチするための正しいプロトタイプ宣言は何ですか? myObject は変更されたプロトタイプを持つオブジェクトです。

「myObject.x」は関数によってキャッチされ、「x」にアクセスしようとする呼び出しがあったことをログに記録し、呼び出されたものに応じて x を返します (あまり重要ではありません)。

(x は任意の有効な変数名である可能性があります) 編集: したがって、「myObject.foo」は「foo」のコンソール出力を提供し、「myObject.bar」は「bar」を返します。

変数が返される前に変数が変更されたスクリプトでこれが使用されているのを見たことがありますが、もう一度見つけるのに十分な記憶がありません。

4

3 に答える 3

1

x(プロパティの代わりに) メソッドを作成し、それをサブクラスでオーバーライドして (ロギング呼び出しを追加)、使用prototype.x.callしてスーパー メソッドを呼び出すことができます。

var Foo = function () {
    this.x = function () {
        console.log('ancestor x');
    }
}

var Bar = function () {
    this.x = function () {
        console.log('inherited x');
        Bar.prototype.x.call(this);
    }
}

Bar.prototype = new Foo;

new Bar().x();

それ以外の場合は、いくつかのベンダー拡張機能と ES5/6 ゲッター メソッドがありますが、これらのオプションのいずれかに対する不安定なブラウザー サポートに対処する必要があります。

フィドル

于 2013-03-27T01:20:19.097 に答える
0

ゲッター/セッターを探しています:

foo = {};
var x;
Object.defineProperty(foo, 'x', {
    get: function () {
        console.log("Getting:",x);
        return x; // or not..
    },
    set: function (val) {
        console.log("Setting to:", val);
        x = val;
        return x;
    }
});

もちろん、これらはレガシー ブラウザでは機能しません。

編集: この種の Waject を作成しました: https://github.com/spn/Waject

于 2013-03-27T01:25:24.807 に答える
0

変数のすべての要求をキャッチするための正しいプロトタイプ宣言は何ですか? myObject は変更されたプロトタイプを持つオブジェクトです。

これは、JavaScript のプロトタイプの継承とはあまり関係がありません。プロトタイプを使用してオブジェクトを作成するにはnew、コンストラクター関数のキーワードをprototypeプロパティと共に使用するか、 を使用しObject.createます。あなたが興味を持っているのは、すべてのプロパティがアクセスできるオブジェクトを構築する方法です…</p>

関数に引っかかるだろう

残念ながら、これは現在の JavaScript では不可能です。特定の名前を持つプロパティ (値または getter/setter を使用) のみを設定できます。キャッチオール動作は現在実装されていませんが、一部のエンジンはProxyドラフトをサポートしています。そのためには、プロパティの __noSuchMethod__ 機能に相当するもの、または JS でそれを実装する方法はありますか? を参照してください。デフォルト値を持つ Javascript 配列 (Python の defaultdict と同等)? またはread の前に未定義の JavaScript プロパティを設定します


これは、プロパティの代わりに明示的なゲッター関数を使用して、あなたが望むものに最も近いと思います:

function Entity() {
   this.data = {position_X:5, foo:"bar", …};
}
Entity.prototype.get = function (name) {
    console.log("access on "+name);
    return this.data[name];
};

var entity = new Entity;
entity.get("x"); // undefined, but logs "access on x"
entity.get("position_X"); // 5, and logs "access on position_X"
entity.get("foo"); // "bar", and logs "access on foo"
于 2013-03-27T01:45:31.997 に答える