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

问题描述 投票:2回答:4

从研究中我了解到,在javascript中,可变对象()通过call-by-reference来处理,而不可变对象通过call-by-value调用约来处理。

假设我使用这种数据,

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

var v = new Node(0);

v是一个可变对象还是一个不可变对象?

javascript calling-convention function-object
4个回答
1
投票

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

它会:

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

所以在你的情况下:

var v = new Node(0);

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

Here是原始(不可变)类型: 布尔 空值 未定义 数 串 符号(ECMAScript 6中的新内容)


2
投票

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

1)原语 - 不可变的

2)对象 - 可变

更新:object freeze可以给一些“不可变”


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

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()方法冻结了一个对象。无法再更改冻结对象;冻结对象可防止将新属性添加到其中,从而删除现有属性,防止更改现有属性的可枚举性,可配置性或可写性,并防止更改现有属性的值。此外,冻结对象还可以防止其原型被更改。 freeze()返回传入的相同对象.more

© www.soinside.com 2019 - 2024. All rights reserved.