Javascript 如何使用js es5 Object.defineProperty重载=运算符

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语法。 现

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语法。
现在
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/setter
v
不再是一个属性,它只是一个保存值的变量


也就是说,虽然您无法对任意变量执行此操作,但允许您编写类似于变量赋值的代码,并执行您期望的操作:

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/setter
v
不再是一个属性,它只是一个保存值的变量


也就是说,虽然您无法对任意变量执行此操作,但允许您编写类似于变量赋值的代码,并执行您期望的操作:

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/setter
v
不再是一个属性,它只是一个保存值的变量


也就是说,虽然您无法对任意变量执行此操作,但允许您编写类似于变量赋值的代码,并执行您期望的操作:

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/setter
v
不再是一个属性,它只是一个保存值的变量


也就是说,虽然您无法对任意变量执行此操作,但允许您编写类似于变量赋值的代码,并执行您期望的操作:

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中可能吗?不可能。