Entiendo que los objetos de JavaScript, incluidas las matrices, se pasan automáticamente por referencia, por lo que tengo algo como esto:
class Thing { constructor( ) { this.letters = [ "A", "B" ]; this.numbers = [ 1, 2, 3 ]; this.change( this.letters, this.numbers ); } change( _letters, _numbers ) { let l = _letters; let n = _numbers; l = [ ]; n = 6; } } var t = new Thing( ); console.log( t ); La solicitud de registro muestra que no ha habido cambios en las propiedades de Thing . Y, sin embargo, bajo diferentes condiciones que no puedo reconocer, modifiqué accidentalmente los parámetros pasados dentro de una función y tuve que usar algo como n = Array.from( _numbers ) para evitar modificar la propiedad de origen. ¿Alguien sería capaz de explicar lo que está sucediendo y por qué?
Me gustaría pasar las propiedades del objeto por referencia, de modo que pueda modificar más de una propiedad relacionada en una sola llamada de función y, por lo tanto, reservar el valor devuelto para fines de depuración.
Gracias.
El tema es el alcance. Cuando declaró con let , la declaración tiene como alcance el change de función y también está reasignando las variables con alcance de bloque aquí:
l = [ ]; n = 6;Si desea cambiar las propiedades de la clase, puede hacerlo:
change(_letters, _numbers) { this.letters = _letters; // `this` scoped to class this.numbers = _numbers; // `this` scoped to class }Ver el ejemplo:
// simple demo start let numbers = [1, 2, 3]; let n = numbers; n.push(4) console.info(n, typeof n); n = 6; // reassign n console.info(n, typeof n, numbers); // simple demo end // refactored class class Thing { constructor() { this.letters = ["A", "B"]; this.numbers = [1, 2, 3]; this.change(this.letters, this.numbers); } change(_letters, _numbers) { let l = _letters; // `let` is scoped to `change()` let n = _numbers; // `let` is scoped to `change()` l = []; // only changes scoped l n = 6; // only changes scoped n } changeFix(_letters, _numbers) { this.letters = _letters; // `this` scoped to class this.numbers = _numbers; // `this` scoped to class } } var t = new Thing(); console.log(t); t.change(['C'], [4]); console.info(t); t.changeFix(['C'], [4]); console.info(t);