cari

Rumah  >  Soal Jawab  >  teks badan

Laksanakan tingkah laku penunjuk: buat penugasan semula objek atau tatasusunan kelihatan kepada kelas lain

Pertimbangkan kod berikut:

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)

Apabila saya menetapkan semula hartanah, kelas lain boleh melihat perubahan (salinan rujukan tidak diubah). Tetapi apabila saya menetapkan semula tatasusunan atau objek, kelas lain tidak melihat perubahan itu (salinan rujukan telah berubah). Seperti yang ditunjukkan dalam output di bawah:

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

Adakah terdapat cara untuk membuat perubahan kelihatan kepada kelas lain pada pengagihan semula, untuk melaksanakan gelagat penunjuk yang perubahan "kelihatan" merentas banyak kelas yang memegang rujukan?

P粉899950720P粉899950720517 hari yang lalu560

membalas semua(1)saya akan balas

  • P粉605233764

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

    Penyelesaian menggunakan getter dan setter adalah seperti berikut:

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

    balas
    0
  • Batalbalas