Объектный литеральный конструктор - PullRequest
0 голосов
/ 15 сентября 2018

Я ищу способ изменить объект, который был определен литералом, не передавая его в другую функцию.

пример:

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

Я думал, когда я определяю объектиспользуя литерал, будет вызван конструктор Object, поэтому я переопределил Object.prototype.constructor, но он вызывается только тогда, когда я задаю new Object({a:1,b:2})

вопрос в более простых терминах, может ли кто-нибудь сделать a=3, не передавая объект oдля функции или прокси или используя ключевое слово o.a=3 или with, где o определяется с использованием литерала объекта?

Ответы [ 4 ]

0 голосов
/ 15 сентября 2018

То, чего вы хотите достичь, может быть сделано, если o.a содержит ссылку на переменную a - что, к сожалению, работает только так, как вы хотели бы для переменных, которые передаются по ссылке . Тем не менее, примитивные типы, такие как String, Number и Boolean, передаются значением .

Проверьте примеры ниже:

var a = 1;

var o = { a: a };

a = 2;

console.log(o.a, a);

Также не помогает использовать конструктор объекта, такой как new Number(), потому что он возвращает ссылку на объект (который передается по ссылке , как вам нужно), но назначает новый чтение значения по-прежнему возвращает примитив (который, опять же, передается значением ):

var a = new Number(1);

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

a = Number(2);

console.log(o.a, a);

Если вы передадите что-то, что естественно передается по ссылке, ваше ожидание сбудется:

var a = [ 1 ]

var o = { a: a }

a[0] = 2

console.log(o.a[0])
0 голосов
/ 15 сентября 2018

вопрос в более простых терминах: может ли кто-нибудь сделать a = 3, не передавая объект o функции или прокси-серверу?

  o.a = 3;

Я ищу способ изменить объект, определенный литералом, без передачи его в другую функцию.

Это невозможно, потому что, если бы это было возможно, вы могли бы сломать каждый кусок JavaScript. И это было бы ужасно.

Ой, подождите, это JS ...

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

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

 }
0 голосов
/ 15 сентября 2018

Это просто невозможно.
Нет конструктора литерала объекта.
Вы можете создавать объекты различными способами:

  • через литерал объекта или * 1007.*
  • через функцию конструктора или
  • через Object.create

Также см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer

0 голосов
/ 15 сентября 2018

Просто сделай o.a=3; и консольный журнал o:

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

В настоящее время вы делаете o.a===3, который будет возвращать значение Boolean вместо перезаписи значения свойства a.

Вы также не можете выполнить o.a=3 внутри console.log(), поскольку o.a=3 вернет присвоенное значение, равное 3, но все равно изменит свойство a из o на 3.

let o = {
  a: 1,
  b: 2
};
//won't print o but changes o.a to 3
console.log(o.a = 3);
...