JavaScript 中的 Object.freeze()
JavaScript 中的对象和对象构造函数?
在面向对象编程的现实世界中,我们已经知道类和对象的重要性,但与其他编程语言不同,JavaScript 没有其他语言中看到的传统类。但是 JavaScript 有对象和构造函数,它们大多以相同的方式执行相同类型的操作。
- 构造函数是与“new”关键字一起使用的通用 JavaScript 函数。 JavaScript 中的构造函数有两种类型,即内置构造函数(数组和对象)和自定义构造函数(为特定对象定义属性和方法)。
- 当我们需要一种方法来创建可以多次使用的对象“类型”而不必每次都重新定义对象时,构造函数会很有用,这可以使用对象构造函数来实现。将构造函数的名称大写以将它们与常规函数区分开来是一种惯例。
例如,考虑以下代码:
function Automobile(color) {
this.color=color;
}
var vehicle1 = new Automobile ("red");
函数“Automobile()”是一个对象构造函数,它的属性和方法,即“color”是通过在它的前面加上关键字“this”来声明的。使用对象构造函数定义的对象然后使用关键字“new”成为即时对象。
当 new Automobile() 被调用时,JavaScript 做了两件事:
- 它创建一个新的对象(实例)汽车()并将其分配给一个变量。
- 它将对象的构造函数属性(即“颜色”)设置为汽车。
Object.freeze() 方法
在 Object 构造方法中,有一个方法 Object.freeze() 用于冻结对象。冻结对象不允许向对象添加新属性,并防止删除或更改现有属性。 Object.freeze() 保留了对象的可枚举性、可配置性、可写性和原型。它返回传递的对象并且不创建冻结副本。
应用:
- Object.freeze() 用于冻结对象和数组。
- Object.freeze() 用于使对象不可变。
句法:
Object.freeze(obj)
使用的参数:
- obj :它是必须被冻结的对象。
返回值:
Object.freeze() 返回传递给函数的对象。
下面提供了上述函数的示例。
例子:
Input : const obj1 = { property1: 'initial_data'};
const obj2 = Object.freeze(obj1);
obj2.property1 = 'new_data';
console.log(obj2.property1);
Output : "initial_data"
说明 :在本例中,对象“obj2”已从对象“obj1”分配属性,“obj1”的属性被冻结,因此新属性和值被阻止添加到“obj2”。
Input : var obj = { prop: function() {}, name: 'adam' };
console.log(obj);
obj.name = 'billy';
delete obj.prop;
console.log(obj);
var o = Object.freeze(obj);
obj.name = 'chris';
console.log(obj);
Output : Object { prop: function () {}, name: "adam" }
Object { name: "billy" }
Object { name: "billy" }
解释:在这个例子中,对象“obj”被分配了“prop: 函数”,由于对象“obj没有被冻结”,它后来被删除了。在那之后,一个新的对象“o”被分配了“obj”的冻结值,这阻止了它的进一步更新。
下面提供了上述函数的代码。
代码 1:
html
html
输出 :
"initial_data"
代码 2:
html
输出 :
Object { prop: function () {}, name: "adam" }
Object { name: "billy" }
Object { name: "billy" }
例外:
- 如果传递的参数不是 object ,则会导致 TypeError。
支持的浏览器:
- 谷歌浏览器 6.0 及以上
- Internet Explorer 9.0 及更高版本
- Mozilla 4.0 及更高版本
- Opera 11.1 及更高版本
- Safari 5.0 及以上
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze