如何使用setter实现JavaScript对象的自我覆盖?
解决通过Setter覆盖对象自身的问题
在JavaScript中,this是函数执行上下文的只读引用,你确实没法直接给this赋值,所以setter里的this = value语法本身就不合法。根据你的需求,分两种场景给你解决方案:
场景1:保留原对象引用,仅更新属性
如果你希望原对象的引用不变,只是让它拥有新对象的所有属性,可以通过遍历新对象属性、替换当前对象属性的方式实现:
class myClass { set updateObj(value) { // 先清空当前对象的所有原有属性 Object.keys(this).forEach(key => delete this[key]); // 将新对象的属性全部合并到当前对象 Object.assign(this, value); } } let myObject = new myClass() const test = (myObject.updateObj = { foo: "bar" }) console.log(test) // 输出: { foo: "bar" } console.log(myObject) // 输出: myClass { foo: "bar" }
这种方式下,myObject的引用始终没变,但内部属性被完全替换成了新对象的内容。
场景2:完全替换对象(改变变量引用)
如果你的目标是让myObject变量直接指向新对象,setter本身做不到——因为setter只能操作当前对象的内部,无法修改外部变量的引用。这时候可以用两种方式解决:
方式1:使用包装类持有对象引用
通过一个包装类来存储目标对象,setter修改包装类内部的引用:
class myClass {} class ObjectWrapper { constructor(initialObj) { this.target = initialObj; } set updateObj(newValue) { this.target = newValue; } } let myWrapper = new ObjectWrapper(new myClass()); const test = (myWrapper.updateObj = { foo: "bar" }); console.log(test) // 输出: { foo: "bar" } console.log(myWrapper.target) // 输出: { foo: "bar" }
之后通过myWrapper.target就能访问到最新的对象。
方式2:直接重新赋值变量
这是最直接的方案,放弃setter,直接给变量重新赋值:
class myClass {} let myObject = new myClass(); // 直接替换变量引用 myObject = { foo: "bar" }; console.log(myObject) // 输出: { foo: "bar" }
内容的提问来源于stack exchange,提问作者SM21
相关产品推荐
相关产品推荐

