返回

手撕前端面试,王者之路 | 精通new操作符与Object.freeze

前端

JavaScript 中 new 操作符和 Object.freeze 深入解析

一、JavaScript 对象创建剖析

1. 创建对象的两种方式

在 JavaScript 中,创建对象有两种主要方式:对象字面量和构造函数。

对象字面量 创建的是一个简单的对象,它包含键值对集合,如下所示:

const obj = {
  name: '张三',
  age: 18
};

构造函数 创建的是更复杂的自定义对象,它可以通过 new 操作符调用,如下所示:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

const person = new Person('李四', 20);

2. new 操作符的本质

new 操作符是一种语法糖,它本质上是对构造函数的调用。它执行以下步骤:

  1. 创建一个新对象。
  2. 将构造函数的 this 指向新对象。
  3. 执行构造函数,为新对象添加属性和方法。
  4. 返回新对象。

二、手写 new 操作符

下面是一个自己手写的 new 操作符的例子:

function newOperator(constructor, ...args) {
  const obj = {};
  constructor.prototype = obj;
  constructor.apply(obj, args);
  return obj;
}

const person = newOperator(Person, '王五', 22);

三、Object.freeze 剖析

Object.freeze 方法可以冻结一个对象,使它的属性不可更改,并且阻止对象被扩展或修改。

const obj = {
  name: '张三',
  age: 18
};

Object.freeze(obj);

冻结对象后,不能再添加或修改属性,也不能扩展对象,如下所示:

obj.name = '李四';
obj.age = 20;

obj.gender = '男';

console.log(obj); // { name: '张三', age: 18 }

四、手写 Object.freeze

下面是一个自己手写的 Object.freeze 方法的例子:

function freezeObject(obj) {
  for (const key in obj) {
    const descriptor = Object.getOwnPropertyDescriptor(obj, key);
    descriptor.writable = false;
    descriptor.configurable = false;
    Object.defineProperty(obj, key, descriptor);
  }
  return obj;
}

const obj = {
  name: '张三',
  age: 18
};

freezeObject(obj);

结语

通过本文,我们深入了解了 JavaScript 中对象的创建过程和 Object.freeze 方法。我们还练习了手写核心函数,提高了对 JavaScript 的理解。这些知识不仅可以帮助我们通过面试,更重要的是,可以在实际开发中游刃有余。

常见问题解答

  1. 为什么我们需要自己手写这些函数?

手写这些函数可以帮助我们更深入地理解它们的内部工作原理,并提高我们的 JavaScript 技能。

  1. new 操作符和构造函数有什么区别?

new 操作符调用构造函数并自动创建和返回一个新对象。

  1. Object.freeze 方法有什么限制?

Object.freeze 方法冻结对象后,它的属性不可更改,并且阻止对象被扩展或修改。但是,它不能冻结对象的方法。

  1. 如何判断一个对象是否被冻结?

可以使用 Object.isFrozen() 方法来判断一个对象是否被冻结。

  1. 何时应该使用 Object.freeze 方法?

当我们需要保护对象的状态不变时,可以使用 Object.freeze 方法。例如,保护敏感数据或防止对象被意外修改。