javascript 学习笔记深入篇2

101 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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。

冻结方法的目的是什么

以下是使用冻结方法的主要好处,

  1. 它用于冻结对象和数组。
  2. 它用于使对象不可变。

为什么我需要使用冻结方法

在面向对象的范例中,现有的 API 包含某些元素,这些元素不打算在其当前上下文之外进行扩展、修改或重用。因此,它作为final用于各种语言的关键字。

你如何确定对象是否被冻结

Object.isFrozen() 方法用于确定对象是否被冻结。如果以下所有条件都成立,则对象被冻结,

  1. 如果它不可扩展。
  2. 如果它的所有属性都是不可配置的。
  3. 如果它的所有数据属性都是不可写的。用法如下,
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() 方法的主要应用,

  1. 它用于密封对象和数组。
  2. 它用于使对象不可变。

冷冻法和密封法有什么区别

如果使用 Object.freeze() 方法冻结对象,那么它的属性将变得不可变,并且不能对其进行更改,而如果使用 Object.seal() 方法密封对象,则可以在现有属性中进行更改的对象。

如何判断一个物体是否密封

Object.isSealed() 方法用于确定对象是否密封。如果以下所有条件都成立,则对象被密封

  1. 如果它不可扩展。
  2. 如果它的所有属性都是不可配置的。
  3. 如果它是不可移动的(但不一定是不可写的)。让我们在行动中看到它
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