Implémenter le comportement du pointeur : rendre les réaffectations d'objets ou de tableaux visibles aux autres classes
P粉899950720
P粉899950720 2023-09-11 08:57:15
0
1
544

Considérez le code suivant :

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)

Lorsque je réinitialise la propriété, les autres classes peuvent voir le changement (la copie de référence n'est pas modifiée). Mais lorsque je réaffecte le tableau ou l'objet, les autres classes ne voient pas le changement (la copie de référence a changé). Comme le montre le résultat ci-dessous :

//重置
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 ] } // 更改对其他类不可见

Existe-t-il un moyen de rendre les modifications visibles aux autres classes lors de la réallocation, d'implémenter un comportement de pointeur où les modifications sont « visibles » dans de nombreuses classes contenant des références ?

P粉899950720
P粉899950720

répondre à tous(1)
P粉605233764

La solution utilisant les getters et les setters est la suivante :

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]
    }
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal