考虑以下代码:
class ClassA {
constructor(positon, obj) {
this.position = positon
this.obj = obj
}
}
class ClassB {
constructor() {
this.position = [1, 2]
this.obj = {
pos: [1, 2, 3],
rot: [4, 5, 6]
}
this.classAInstance = new ClassA(this.position , this.obj)
}
}
class ClassC {
constructor(position, obj) {
this.obj = obj
this.position = position
}
reassignObj(){
this.obj = {
pos: [4, 5, 6],
rot: [7, 8, 9]
}
}
resetObj() {
this.obj.pos = [4, 5, 6],
this.obj.rot = [7, 8, 9]
}
reassignPosition() {
this.position = [3, 4]
}
resetPosition() {
this.position[0] = 3
this.position[1] = 4
}
}
let fItem = new ClassB()
let other = new ClassC(fItem.position, fItem.obj)
other.resetObj()
other.resetPosition()
console.log('RE-SETTING')
console.log('FITEM', fItem.position, fItem.obj)
console.log('OTHER', other.position, other.obj)
fItem = new ClassB()
other = new ClassC(fItem.position, fItem.obj)
other.reassignObj()
other.reassignPosition()
console.log('RE-ASSINGNING')
console.log('FITEM', fItem.position, fItem.obj)
console.log('OTHER', other.position, other.obj)
当我重置属性时,其他类可以看到更改(引用副本未更改)。但是当我重新分配数组或对象时,其他类看不到更改(引用副本已更改)。如下面的输出所示:
//重置
FITEM [ 3, 4 ] { pos: [ 4, 5, 6 ], rot: [ 7, 8, 9 ] }
OTHER [ 3, 4 ] { pos: [ 4, 5, 6 ], rot: [ 7, 8, 9 ] } // 更改对其他类可见
//重新分配
FITEM [ 1, 2 ] { pos: [ 1, 2, 3 ], rot: [ 4, 5, 6 ] }
OTHER [ 3, 4 ] { pos: [ 4, 5, 6 ], rot: [ 7, 8, 9 ] } // 更改对其他类不可见
有没有办法使更改在重新分配时对其他类可见,以实现一种指针行为,使更改在许多持有引用的类之间是“可见”的?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
使用getter和setter的解决方案如下:
class ClassC { constructor(position, obj) { this._obj = obj this._position = position } reassignObj(){ this.obj = { pos: [4, 5, 6], rot: [7, 8, 9] } } resetObj() { this.obj.pos = [4, 5, 6], this.obj.rot = [7, 8, 9] } reassignPosition() { this.position = [3, 4] } resetPosition() { this.position[0] = 3 this.position[1] = 4 } get obj() { return this._obj } set obj(value) { this._obj.pos = value.pos this._obj.rot = value.rot } get position() { return this._position } set position(value) { this._position[0] = value[0] this._position[1] = value[1] } }