Skip to content

构造器和 new 操作符

构造函数

构造函数在技术上是常规函数。不过有两个约定:

  1. 它们的命名以大写字母开头。
  2. 它们只能由 new 操作符来执行。

new 操作符

通过执行自定义构造函数或内置对象构造函数,生成对应的对象实例。

执行过程

  1. 首先创建了一个新的空对象
  2. 设置原型,将对象的原型([[prototype]])设置为函数的 prototype 对象。
  3. 让函数的 this 指向这个对象,执行构造函数的代码(为这个新对象添加属性)。
  4. 判断函数的返回值类型,如果是值类型,返回创建的对象。如果是引用类型,就返回这个引用类型的对象。

模拟实现

javascript
function newOperator(constructor, ...args) {
  // 创建一个空对象
  const obj = {}
  // 将对象的原型设置为构造函数的原型
  Object.setPrototypeOf(obj, constructor.prototype)
  // 调用构造函数并将this绑定到新对象上
  const result = constructor.apply(obj, args)
  // 如果构造函数返回了一个对象,则返回该对象,否则返回新对象
  return result instanceof Object ? result : obj
}

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

const person = newOperator(Person, 'Tom', 18)
console.log(person) // { name: 'Tom', age: 18 }