Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;
冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。
此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。
以下内容参照链接:https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
const obj = {
prop: 42
};
Object.freeze(obj);
obj.prop = 33;
// Throws an error in strict mode严格模式下报错
console.log(obj.prop);
// expected output: 42
1.对象冻结
var obj = {
prop: function() {},
foo: 'bar'
};
// Vor dem Einfrieren: neue Eigenschaften können hinzugefügt//冻结前:可以添加新属性
// und vorhandene Eigenschaften geändert oder entfernt werden//以及更改或删除现有属性
obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;
// Einfrieren
var o = Object.freeze(obj);
// Der Rückgabewert ist dasselbe Objekt, das übergeben wurde返回值与传递的对象相同
o === obj; // true
// Das Objekt ist eingefroren对象已冻结
Object.isFrozen(obj); // === true
// Jetzt schlagen sämtliche Änderungen fehl现在所有更改都失败了
obj.foo = 'quux'; // 改变属性值失败
// 添加属性失败
obj.quaxxor = 'the friendly duck';
// Im strikten Modus lösen solche Versuche TypeErrors aus
//在严格模式下,这样的测试会触发类型错误
function fail(){
'use strict';
obj.foo = 'sparky'; //触发器类型错误 löst TypeError aus
delete obj.foo; // 触发器类型错误löst TypeError aus
delete obj.quaxxor;
// 返回true,因为从未添加属性
obj.sparky = 'arf'; //触发器类型错误 löst TypeError aus
}
fail();
// Object.defineProperty更改失败,两个语句都触发TypeError
Object.defineProperty(obj, 'ohai', { value: 17 });
Object.defineProperty(obj, 'foo', { value: 'eit' });
// 原型也不可
// 两个语句都触发TypeError
Object.setPrototypeOf(obj, { x: 20 })
obj.__proto__ = { x: 20 }
2.数组冻结
let a = [0];
Object.freeze(a); // 无法再更改数组
a[0]=1; // 失败
a.push(2); // 失败
// 在严格模式下,这样的测试会触发类型错误
function fail() {
"use strict"
a[0] = 1;
a.push(2);
}
fail();
3.浅冻结
var employee = {
name: "Mayank",
designation: "Developer",
address: {
street: "Rohini",
city: "Delhi"
}
};
Object.freeze(employee);
employee.name = "Dummy"; //失败
employee.address.city = "Noida"; // 在非严格模式下,可以更改子对象的属性
console.log(employee.address.city) // "Noida"
4.深冻结
function deepFreeze(object) {
var propNames = Object.getOwnPropertyNames(object);
for (let name of propNames) {
let value = object[name];
object[name] = value && typeof value === "object" ?
deepFreeze(value) : value;
}
return Object.freeze(object);
}
var obj2 = {
internal: {
a: null
}
};
deepFreeze(obj2);
obj2.internal.a = 'anotherValue'; // 失败
obj2.internal.a; // null
5.如果此方法的参数不是对象,则会导致ES5中的类型错误。在ES2015中,非对象参数被视为冻结的普通对象并简单地返回。
> Object.freeze(1)
TypeError: 1 is not an object // ES5 Code
> Object.freeze(1)
1
网友评论