2015-08-22 2 views
0

I Что перегрузить оператор = для объектов JS с использованием Object.defineProperty.Как перегружать = оператор с js es5 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)?

+0

* Возможно ли (в es5)? * - № – thefourtheye

+0

можно ли в es6? – amin

+0

Нет. Оператор присваивания связывает объект с правой стороны с идентификатором левой стороны. Таким образом, это невозможно. – thefourtheye

ответ

1

Нет, это невозможно. Фактически вы не перегружаете оператора =, вы перегружаете оператора . (или вообще аксессуаров для объектов). Ваш геттер/сеттер будет вызываться всякий раз, когда используется свойство вашего объекта. v больше не является свойством, это просто переменная, которая содержит значение.


Тем не менее, в то время как вы не можете сделать это для произвольных переменных with statement действительно позволяет писать код, который выглядит как присваивания значения переменной и делает то, что вы ожидали:

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

Обратите внимание, что это на самом деле действительно страшно, и вы действительно не должны этого делать. Это запрещено по строгим правилам.

1

Вы можете скопировать дескриптор свойства на другой объект, но это может привести к неожиданным результатам в зависимости от того, как ссылка вещи (например, вы ссылаетесь obj._var, но подобная реализация может использовать this._var или замыкание) - Paul S.

@PaulS. вы можете привести пример. Благодарю. - Амин

Предположим, вы ваше определение настроить

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

Теперь скопируйте дескриптор на другой объект,

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 
Смежные вопросы