使用new命令时,它后面的函数依次执行下面的步骤。
- 创建一个空对象,作为将要返回的对象实例。
- 将这个空对象的原型,指向构造函数的prototype属性。
- 将这个空对象赋值给函数内部的this关键字。
- 如果构造函数返回了一个对象,则返回该对象,否则返回新创建的对象。
模拟实现
[].slice.call()
将伪数组转为真数组,等同Array.from()
js
function _new(constructor, ...args) {
// 1. 创建一个空对象,作为将要返回的对象实例。
const obj = {}
// 2. 将这个空对象的原型,指向构造函数的prototype属性。
obj.__proto__ = constructor.prototype
// 3. 将这个空对象赋值给函数内部的this关键字。(使用构造函数处理obj作为上下文this)
const result = constructor.apply(obj, [].slice.call(args))
// 4. 如果构造函数返回了一个对象,则返回该对象,否则返回新创建的对象。
return (typeof result === 'object' && result != null) ? result : obj;
}
// 使用
function Person(name, age) {
this.name = name
this.age = age
}
Person.prototype.say = function() {
return `我叫: ${this.name}, 今年: ${this.age} 岁!`
}
const person1 = _new(Person, '张三', 22)
const person2 = _new(Person, '李四', 18)