Javascript 如何使用js es5 Object.defineProperty重载=运算符
I如何使用Javascript 如何使用js es5 Object.defineProperty重载=运算符,javascript,defineproperty,Javascript,Defineproperty,I如何使用Object.defineProperty为JS对象重载=操作符 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语法。 现
Object.defineProperty
为JS对象重载=
操作符
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中)
您可以将属性描述符复制到另一个对象上,但这可能会产生意外的结果,具体取决于引用对象的方式(例如,您引用obj.\u var
,但类似的实现可以使用this.\u var
或闭包)–Paul 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; }
});
现在将描述符复制到另一个对象上
然后您可以通过这个不同的对象使用这些getter和setter
o2.copied_var = 1; // logs set
o2.copied_var; // 1, logs get
但是请注意,因为函数中的引用是指向对象的
o2._var; // undefined
obj._var; // 1
obj.var; // 1 (same lookup), logs get
您可以将属性描述符复制到另一个对象上,但这可能会产生意外的结果,具体取决于引用对象的方式(例如,您引用obj.\u var
,但类似的实现可以使用this.\u var
或闭包)–Paul 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; }
});
现在将描述符复制到另一个对象上
然后您可以通过这个不同的对象使用这些getter和setter
o2.copied_var = 1; // logs set
o2.copied_var; // 1, logs get
但是请注意,因为函数中的引用是指向对象的
o2._var; // undefined
obj._var; // 1
obj.var; // 1 (same lookup), logs get
您可以将属性描述符复制到另一个对象上,但这可能会产生意外的结果,具体取决于引用对象的方式(例如,您引用obj.\u var
,但类似的实现可以使用this.\u var
或闭包)–Paul 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; }
});
现在将描述符复制到另一个对象上
然后您可以通过这个不同的对象使用这些getter和setter
o2.copied_var = 1; // logs set
o2.copied_var; // 1, logs get
但是请注意,因为函数中的引用是指向对象的
o2._var; // undefined
obj._var; // 1
obj.var; // 1 (same lookup), logs get
您可以将属性描述符复制到另一个对象上,但这可能会产生意外的结果,具体取决于引用对象的方式(例如,您引用obj.\u var
,但类似的实现可以使用this.\u var
或闭包)–Paul 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; }
});
现在将描述符复制到另一个对象上
然后您可以通过这个不同的对象使用这些getter和setter
o2.copied_var = 1; // logs set
o2.copied_var; // 1, logs get
但是请注意,因为函数中的引用是指向对象的
o2._var; // undefined
obj._var; // 1
obj.var; // 1 (same lookup), logs get
不,这是不可能的。实际上,您没有重载
=
运算符,而是重载
运算符(或一般的属性访问器)。只要使用对象的属性,就会调用getter/setterv
不再是一个属性,它只是一个保存值的变量
也就是说,虽然您无法对任意变量执行此操作,但允许您编写类似于变量赋值的代码,并执行您期望的操作:
with({
get v() { console.log("get"); return 5; },
set v(x) { console.log("set", x); }
}) {
v = 5; // set 5
console.log(v); // get, 5
}
注意,这真的很可怕,你真的不应该这样做。有充分的理由禁止它进入严格模式。不,这是不可能的。实际上,您没有重载
=
运算符,而是重载
运算符(或一般的属性访问器)。只要使用对象的属性,就会调用getter/setterv
不再是一个属性,它只是一个保存值的变量
也就是说,虽然您无法对任意变量执行此操作,但允许您编写类似于变量赋值的代码,并执行您期望的操作:
with({
get v() { console.log("get"); return 5; },
set v(x) { console.log("set", x); }
}) {
v = 5; // set 5
console.log(v); // get, 5
}
注意,这真的很可怕,你真的不应该这样做。有充分的理由禁止它进入严格模式。不,这是不可能的。实际上,您没有重载
=
运算符,而是重载
运算符(或一般的属性访问器)。只要使用对象的属性,就会调用getter/setterv
不再是一个属性,它只是一个保存值的变量
也就是说,虽然您无法对任意变量执行此操作,但允许您编写类似于变量赋值的代码,并执行您期望的操作:
with({
get v() { console.log("get"); return 5; },
set v(x) { console.log("set", x); }
}) {
v = 5; // set 5
console.log(v); // get, 5
}
注意,这真的很可怕,你真的不应该这样做。有充分的理由禁止它进入严格模式。不,这是不可能的。实际上,您没有重载
=
运算符,而是重载
运算符(或一般的属性访问器)。只要使用对象的属性,就会调用getter/setterv
不再是一个属性,它只是一个保存值的变量
也就是说,虽然您无法对任意变量执行此操作,但允许您编写类似于变量赋值的代码,并执行您期望的操作:
with({
get v() { console.log("get"); return 5; },
set v(x) { console.log("set", x); }
}) {
v = 5; // set 5
console.log(v); // get, 5
}
注意,这真的很可怕,你真的不应该这样做。有充分的理由禁止它进入严格模式。是否可能(在es5中)?-不,在es6中可能吗?不可能。赋值运算符将右侧的对象绑定到左侧标识符。所以,这是不可能的。好的,谢谢。如果你发布一个答案,那么我会接受。你为什么一开始就想这么做?它能解决什么问题?是否可能(在es5中)?-不,在es6中可能吗?不可能。