new 关键字的作用
new关键字用于创建用户自定义的对象类型的实例或者具有构造函数的内置对象类型的实例的运算符
大致流程
- 创建一个新的对象
- 设置原型链; 将创建好的对象的 __proto__ 属性被赋值为构造函数的 prototype
- 执行构造函数修改this指向; 构造函数被调用,并且其 this 上下文被设置为新创建的对象
- 返回对象; 构造函数中是否存在return语句, 如果是基本数据类型,则无影响. 如果是复杂类型则会替代新创建好的对象, 其原型链也会丢失
代码实现
function myNew (func, ...args) {
// 创建一个新对象
const obj = {}
// 将对象通过原型链和构造函数链接起来
obj.__proto__ = func.prototype
// 指定将构造函数的this指向指向为新创建好的对象
let result = func.apply(obj, args)
return result instanceof Object ? result : obj
}
// 如果构造函数没有返回语句
const a = myNew(function(name){
this.name = name
this.say = function () {
console.log('my name is:' + this.name)
}
}, 'A')
a => {name: 'A', say: ƒ}
// 如果构造函数返回复杂数据类型
const aa = myNew(function(name){
this.name = name
this.say = function () {
console.log('my name is:' + this.name)
}
return { a:1 }
}, 'A')
aa => { a:1 }
// 如果构造函数返回基本数据类型
const aaa = myNew(function(name){
this.name = name
this.say = function () {
console.log('my name is:' + this.name)
}
return 1
}, 'A')
aaa => {name: 'A', say: ƒ}