如何设置对象属性的rvalue为变量本身而非值,实现两者值始终同步
实现bar与obj.foo双向同步的方案
基础类型赋值是值拷贝,所以直接写foo: bar只会复制bar当前的数值,两者后续修改互不影响。要实现同步,有两种常见方案:
方案1:使用getter/setter(推荐)
直接在对象上定义foo的存取器,让foo的读取和写入直接操作bar变量,不需要修改原有bar的类型和使用习惯:
let bar = 3 let obj = { get foo() { return bar }, set foo(value) { bar = value } } // 测试同步效果 console.log(obj.foo) // 输出3 bar = 5 console.log(obj.foo) // 输出5,修改bar自动同步到obj.foo obj.foo = 10 console.log(bar) // 输出10,修改obj.foo自动同步到bar
注意:该方案依赖作用域访问规则,obj定义的位置必须能正常访问到bar变量才会生效。
方案2:使用引用类型包装值
如果能接受修改bar的定义,也可以把原始值放到引用类型(对象/数组)中,利用引用类型赋值传地址的特性实现同步:
let bar = { value: 3 } let obj = { foo: bar } // 测试同步效果 console.log(obj.foo.value) // 输出3 bar.value = 5 console.log(obj.foo.value) // 输出5,修改bar自动同步到obj.foo obj.foo.value = 10 console.log(bar.value) // 输出10,修改obj.foo自动同步到bar
注意:该方案需要每次读写都通过.value属性操作,不能直接给bar或obj.foo重新赋值,否则会打断引用关系。
内容的提问来源于stack exchange,提问作者JSNinja
相关产品推荐
相关产品推荐

