0

=を使用して JS オブジェクトの演算子をオーバーロードする方法を教えてObject.definePropertyください。

var log = console.log.bind(console);
var obj = { };
Object.defineProperty(obj,'var', {
  get: function() { log('get'); return obj._var; },
  set: function(v) { log('set'); obj._var = v; }
});

これは、単純なプロパティを定義するための標準的な es5 構文です。
現在は、オーバーロードされた演算子obj.varを持つプロパティです。 しかし、実際に何をすべきかは、それ自体の演算子をオーバーロードすることです。=
=obj

obj.var = 'a'; // prints: get
var v = obj.var;
v = 'b';  // prints: nothing!
// of course that's right, because v is an string now.

=オブジェクト自体の演算子をオーバーロードする方法は?

//i what something like this 
v = 'b'; // should print: set

(es5で)可能ですか?

4

2 に答える 2

2

いいえ、これは不可能です。実際には、=演算子をオーバーロードしているのではなく、.演算子 (または一般的なプロパティ アクセサー) をオーバーロードしています。オブジェクトのプロパティが使用されるたびに、ゲッター/セッターが呼び出されます。vはもはやプロパティではなく、値を保持する単なる変数です。


つまり、任意の変数に対してこれを行うことはできませんが、withステートメントを使用すると、変数の代入のように見えるコードを記述して、期待どおりに動作させることができます。

with({
  get v() { console.log("get"); return 5; },
  set v(x) { console.log("set", x); }
}) {
  v = 5; // set 5
  console.log(v); // get, 5
}

これは本当に恐ろしいことであり、これを行うべきではないことに注意してください。正当な理由で厳密モードから禁止されています。

于 2015-08-22T22:14:31.213 に答える
1

プロパティ記述子を別のオブジェクトにコピーできますが、参照方法によっては予期しない結果が生じる可能性があります (たとえば、 を参照obj._varしますが、同様の実装ではthis._varまたは クロージャを使用できます) – Paul S.

@ポールS。例を挙げていただけますか。ありがとう。- にいる

定義が設定されているとします

var log = console.log.bind(console);
var obj = { };
Object.defineProperty(obj,'var', {
  get: function() { log('get'); return obj._var; },
  set: function(v) { log('set'); obj._var = v; }
});

記述子を別のObjectにコピーし、

var o2 = {}; // another object
Object.defineProperty(
    o2, 'copied_var',
    Object.getOwnPropertyDescriptor(obj, 'var')
);

次に、この別のオブジェクトを介してこれらのゲッターとセッターを使用できます

o2.copied_var = 1; // logs set
o2.copied_var;    // 1, logs get

ただし、関数内の参照のために注意してくださいobj._var

o2._var; // undefined
obj._var; // 1
obj.var; // 1 (same lookup), logs get
于 2015-08-22T21:33:01.707 に答える