构造器和 new 操作符
构造函数
构造函数在技术上是常规函数。不过有两个约定:
- 它们的命名以大写字母开头。
- 它们只能由
new
操作符来执行。
new 操作符
通过执行自定义构造函数或内置对象构造函数,生成对应的对象实例。
执行过程
- 首先创建了一个新的空对象
- 设置原型,将对象的原型(
[[prototype]]
)设置为函数的prototype
对象。 - 让函数的 this 指向这个对象,执行构造函数的代码(为这个新对象添加属性)。
- 判断函数的返回值类型,如果是值类型,返回创建的对象。如果是引用类型,就返回这个引用类型的对象。
模拟实现
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 }