返回

New 的实现——从小白到专家

前端

New 的实现

function new (ctor, ...args) {
  // 创建一个中间对象
  const intermediateObject = {};
  // 将中间对象的原型指向构造函数的原型
  intermediateObject.__proto__ = ctor.prototype;
  // 将构造函数的 this 指向该中间对象
  const result = ctor.apply(intermediateObject, args);
  // 如果构造函数返回的是一个对象,则返回该对象
  if (typeof result === 'object' && result !== null) {
    return result;
  }
  // 如果构造函数没有返回对象,则返回中间对象
  return intermediateObject;
}

难点解析

  • 中间对象 :new 运算符首先创建一个中间对象,这个中间对象的作用是作为实例对象的原型链的起点。
  • 原型链 :在 JavaScript 中,每个对象都有一个原型链,原型链是一个指向其他对象的引用链,它允许对象访问其原型对象中的属性和方法。
  • this :在 JavaScript 中,每个函数都有一个 this ,它指向当前函数的执行上下文。
  • 构造函数 :构造函数是用于创建对象的一种特殊函数,它使用 new 运算符调用。

步骤解析

  1. 创建中间对象 :new 运算符首先创建一个中间对象,这个中间对象的作用是作为实例对象的原型链的起点。
  2. 将中间对象的原型指向构造函数的原型 :new 运算符将中间对象的原型指向构造函数的原型,这使得实例对象可以访问构造函数原型对象中的属性和方法。
  3. 将构造函数的 this 指向该中间对象 :new 运算符将构造函数的 this 指向该中间对象,这使得构造函数可以在实例对象上操作属性和方法。
  4. 返回该中间对象 :new 运算符返回该中间对象,即返回实例对象。

实例代码

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

const person = new Person('John', 25);

console.log(person.name); // 'John'
console.log(person.age); // 25

在上面的代码中,Person 是一个构造函数,它接受两个参数:name 和 age。new Person('John', 25) 调用 Person 构造函数,创建一个新的 Person 对象,并将其存储在 person 变量中。

总结

new 运算符是一个非常重要的 JavaScript 操作符,它用于创建对象。new 运算符的实现机制并不复杂,但它涉及到原型链、this 关键字和构造函数等几个知识点。掌握 new 的实现机制,将有助于您更深入地理解 JavaScript 的运行机制。