new操作符做了什么?
- 在内存中创建一个对象
- 将新对象内部的__propto__赋值为构造函数的prototype属性(构造函数的原型对象)
- 将对象作为构造函数的上下文。同时执行构造函数内代码,给新对象添加属性
- 对构造函数的返回值进行判断处理
function Per() {
this.name = '张三'
}
Per.prototype.age = 22
const p1 = new Per()
console.info(p1)
console.info(p1.__proto__ === Per.prototype)
console.info(p1.name)
function Per2() {
this.name = '李四'
return []
}
const p2 = new Per2()
console.info(p2)
new操作符的模拟实现
function MyNew() {
const obj = new Object()
const Constructor = [].shift.call(arguments)
obj.__proto__ = Constructor.prototype
const result = Constructor.apply(obj, arguments)
return typeof result === 'object' && result !== null ? result : obj
}
function Per(name) {
this.name = name
}
const obj = MyNew(Per, '王五')