Считается ли объект функции, созданный конструктором `new`, изменяемым объектом в javascript? - PullRequest
2 голосов
/ 27 апреля 2019

Из изучения я понял, что в javascript изменяемые объекты () обрабатываются вызовом по ссылке , а неизменяемые объекты обрабатываются вызов по значению соглашение о вызовах.

Допустим, я использую такие данные,

var Node = function(data) {
  this.data = data;
  this.next = null;
};

var v = new Node(0);

является v изменяемым объектом или неизменным объектом ??

Ответы [ 4 ]

2 голосов
/ 27 апреля 2019

В JavaScript нет «неизменяемых объектов» 2 типа:

1) примитивы - неизменяемые

2) объект - изменяемые

обновление: объектзамораживание может дать некоторую "неизменность"

1 голос
/ 27 апреля 2019

v является изменяемым объектом. Чтобы изменить этот объект на неизменный объект, используйте метод Object.freeze().

Пример:

var Node = function(data) {
  this.data = data;
  this.next = null;
};

var v = new Node(0); // "v" object is mutable  
v.data = 1;          // The "data" property value will change
console.log(v);

Object.freeze(v); // "v" object is immutable  

v.data = 2;       // The "data" property value will NOT change

console.log(v);

Метод Object.freeze () замораживает объект. Замороженный объект больше не может быть изменен; замораживание объекта предотвращает добавление к нему новых свойств, удаление существующих свойств, предотвращает изменение перечислимости, конфигурируемости или возможности записи существующих свойств и предотвращает изменение значений существующих свойств. Кроме того, замораживание объекта также предотвращает изменение его прототипа. freeze () возвращает тот же объект, который был передан. more

1 голос
/ 27 апреля 2019

Прежде всего, давайте поймем, что оператор new делает внутри созданного контекста выполнения за сценой:

Это будет:

  1. Создатьновый объект (и прикрепить его к метке this)
  2. Свойство __proto__ этого нового объекта будет ссылаться на свойство prototype функции
  3. Возвращать вновь созданный объект (есливы явно не возвращаете объект)

Итак, в вашем случае:

var v = new Node(0);

v на самом деле Object (тот, который был создан и возвращен с помощью new) и объекты в JavaScript являются изменяемыми.

Здесь - это примитивы (неизменяемые) типы:
Boolean
Null
Undefined
Number
String
Символ (новый в ECMAScript 6)

1 голос
/ 27 апреля 2019

Это изменчиво, как вы можете видеть из этого рабочего примера.

var Node = function(data) {
  this.data = data;
  this.next = null;
};

var v = new Node(0);

v.myNewAttribute = 'foobar';

var elemDiv = document.createElement('div');
elemDiv.innerHTML = JSON.stringify(v);
document.body.appendChild(elemDiv);
...