由new构造函数创建的函数对象是否在javascript中被视为可变对象?

时间:2019-04-27 13:14:05

标签: javascript calling-convention function-object

从研究中我了解到,在javascript中,可变对象()由按引用调用处理,而不可变对象根据按值致电调用约定处理。

假设我使用这种数据,

b''

var Node = function(data) { this.data = data; this.next = null; }; var v = new Node(0); 是可变对象还是不可变对象?

4 个答案:

答案 0 :(得分:2)

JavaScript的“不可变对象”没有2种类型:

1)原语-不可变

2)对象-可变

更新:object freeze可以提供一些“不可变的”

答案 1 :(得分:1)

这是可变的,如您在本示例中所见。

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);

答案 2 :(得分:1)

首先让我们了解new operator在幕后创建的执行上下文中做什么:

它将:

  1. 创建一个新对象(并将其附加到this标签上)
  2. 该新对象的__proto__属性将引用该函数的prototype属性
  3. 它将返回新创建的对象(如果您未明确返回对象)

所以在您的情况下:

var v = new Node(0);

v实际上是一个Object(通过new创建和返回的那个),JavaScript中的对象是可变的。

Here是基元(不可变)类型:
布尔值

未定义
编号
字符串
符号(ECMAScript 6中的新功能)

答案 3 :(得分:1)

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()方法冻结对象。冻结的对象无法再更改;冻结对象可防止向其添加新属性,删除现有属性,防止更改现有属性的可枚举性,可配置性或可写性,并防止更改现有属性的值。此外,冻结对象还可以防止更改其原型。 Frozen()返回传入的对象。more