开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情
什么是冻结方法?
freeze() 方法用于冻结对象。冻结对象不允许向对象添加新属性,防止删除并防止更改现有属性的可枚举性、可配置性或可写性。即,它返回传递的对象并且不创建冻结副本。
const obj = {
prop: 100,
};
Object.freeze(obj);
obj.prop = 200; // Throws an error in strict mode
console.log(obj.prop); //100
请记住,冻结仅适用于对象中的顶级属性,不适用于嵌套对象。例如,让我们尝试将具有就业详细信息的用户对象冻结为嵌套对象,并观察详细信息已更改。
const user = {
name: 'John',
employment: {
department: 'IT'
}
};
Object.freeze(user);
user.employment.department = 'HR';
注意: 如果传递的参数不是对象,它会导致 TypeError。
冻结方法的目的是什么
以下是使用冻结方法的主要好处,
- 它用于冻结对象和数组。
- 它用于使对象不可变。
为什么我需要使用冻结方法
在面向对象的范例中,现有的 API 包含某些元素,这些元素不打算在其当前上下文之外进行扩展、修改或重用。因此,它作为final用于各种语言的关键字。
你如何确定对象是否被冻结
Object.isFrozen() 方法用于确定对象是否被冻结。如果以下所有条件都成立,则对象被冻结,
- 如果它不可扩展。
- 如果它的所有属性都是不可配置的。
- 如果它的所有数据属性都是不可写的。用法如下,
const object = {
property: "Welcome JS world",
};
Object.freeze(object);
console.log(Object.isFrozen(object));
什么是代理对象
Proxy 对象用于定义基本操作的自定义行为,例如属性查找、赋值、枚举、函数调用等。语法如下,
var p = new Proxy(target, handler);
让我们以代理对象为例,
var handler = {
get: function (obj, prop) {
return prop in obj ? obj[prop] : 100;
},
};
var p = new Proxy({}, handler);
p.a = 10;
p.b = null;
console.log(p.a, p.b); // 10, null
console.log("c" in p, p.c); // false, 100
在上面的代码中,它使用get处理程序来定义代理在对其执行操作时的行为.
封印法的目的是什么
Object.seal() 方法用于密封对象,通过防止向其添加新属性并将所有现有属性标记为不可配置。但是当前属性的值仍然可以更改,只要它们是可写的。让我们看下面的例子来了解更多关于 seal() 方法
const object = {
property: "Welcome JS world",
};
Object.seal(object);
object.property = "Welcome to object world";
console.log(Object.isSealed(object)); // true
delete object.property; // You cannot delete when sealed
console.log(object.property); //Welcome to object world
密封法的应用有哪些
以下是 Object.seal() 方法的主要应用,
- 它用于密封对象和数组。
- 它用于使对象不可变。
冷冻法和密封法有什么区别
如果使用 Object.freeze() 方法冻结对象,那么它的属性将变得不可变,并且不能对其进行更改,而如果使用 Object.seal() 方法密封对象,则可以在现有属性中进行更改的对象。
如何判断一个物体是否密封
Object.isSealed() 方法用于确定对象是否密封。如果以下所有条件都成立,则对象被密封
- 如果它不可扩展。
- 如果它的所有属性都是不可配置的。
- 如果它是不可移动的(但不一定是不可写的)。让我们在行动中看到它
const object = {
property: "Hello, Good morning",
};
Object.seal(object); // Using seal() method to seal the object
console.log(Object.isSealed(object)); // checking whether the object is sealed or not