Estoy buscando una manera de modificar un objeto que fue definido por un literal sin pasarlo a otra función.

Ejemplo:

let o = {a:1,b:2}
console.log(o.a===3)

Pensé que cuando definía un objeto usando un literal, se llamaría al constructor del Objeto, así que anulé Object.prototype.constructor pero solo se llama cuando lo hago new Object({a:1,b:2})

Pregunta en términos más simples, ¿puede alguien hacer a=3 sin pasar el objeto o a una función o un proxy o usando o.a=3 o with palabra clave, donde o se define usando un objeto literal ?

-5
user8023326 15 sep. 2018 a las 12:05

3 respuestas

Lo que desea lograr podría hacerse si o.a contiene una referencia a la variable a, que desafortunadamente solo funciona de la manera deseada para las variables que pasan por referencia . Sin embargo, los tipos primitivos como String, Number y Boolean se pasan por valor .

Verifique los ejemplos a continuación:

var a = 1;

var o = { a: a };

a = 2;

console.log(o.a, a);

Tampoco ayuda usar un constructor de objetos como new Number() porque eso devuelve una referencia a un objeto (que se pasa por referencia según lo necesite), pero asigna un nuevo al leerlo, el valor aún devuelve una primitiva (que, nuevamente, se pasa por valor ):

var a = new Number(1);

var o = { a: a.valueOf() };

a = Number(2);

console.log(o.a, a);

Si pasa algo que se pasa naturalmente por referencia, su expectativa se cumple:

var a = [ 1 ]

var o = { a: a }

a[0] = 2

console.log(o.a[0])
0
connexo 15 sep. 2018 a las 09:42

Simplemente haga o.a=3; y el registro de la consola o:

let o = {a:1,b:2};
o.a=3;
console.log(o);

Actualmente está haciendo o.a===3 que devolverá el valor Boolean en lugar de sobrescribir el valor de la propiedad a.

Tampoco puede hacer o.a=3 dentro de console.log() porque o.a=3 devolverá el valor asignado que es 3 pero aún cambiará la propiedad a de {{X5} } a 3.

let o = {
  a: 1,
  b: 2
};
//won't print o but changes o.a to 3
console.log(o.a = 3);
2
Ankit Agarwal 15 sep. 2018 a las 09:10

pregunta en términos más simples ¿alguien puede hacer a = 3 sin pasar el objeto o a una función o un proxy?

  o.a = 3;

Estoy buscando una manera de modificar un objeto que fue definido por un literal sin pasarlo a otra función.

Eso es imposible, porque si fuera posible, podría romper cada pieza de JavaScript. Y eso sería terrible.

Oh, espera, esto es JS ...

 with({ get o() { return { a: 3 }; }, set o(v) {} }) {

  o = {a:1,b:2};
  console.log(o.a===3) // true

 }
0
Jonas Wilms 15 sep. 2018 a las 09:16