Heim  >  Fragen und Antworten  >  Hauptteil

Zeigerverhalten implementieren: Neuzuweisungen von Objekten oder Arrays für andere Klassen sichtbar machen

Bedenken Sie den folgenden Code:

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)

Wenn ich die Eigenschaft zurücksetze, können andere Klassen die Änderung sehen (die Referenzkopie wird nicht geändert). Aber wenn ich das Array oder Objekt neu zuweise, sehen andere Klassen die Änderung nicht (die Referenzkopie hat sich geändert). Wie in der Ausgabe unten gezeigt:

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

Gibt es eine Möglichkeit, Änderungen bei der Neuzuweisung für andere Klassen sichtbar zu machen, um ein Zeigerverhalten zu implementieren, bei dem Änderungen in vielen Klassen, die Referenzen enthalten, „sichtbar“ sind?

P粉899950720P粉899950720404 Tage vor494

Antworte allen(1)Ich werde antworten

  • P粉605233764

    P粉6052337642023-09-12 00:24:58

    使用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]
        }
    }

    Antwort
    0
  • StornierenAntwort