手写new
<script>
// new操作符运行步骤
// 1.创建一个空对象
// 2.空对象的__proto__指向构造函数的prototype
// 3.让构造函数的this指向空对象
// 4.返回新对象 执行构造函数中的代码
// 注意:1.若是一个普通函数使用new返回 {} 一个空对象 因为没有使用this
// 2.若构造函数中有返回值,并且返回值是一个对象。则使用new操作符后返回的是构造函数中返回的对象
function myNew() {
// 获取构造函数
let fun = [].shift.call(arguments)[0]
// 创建一个空对象 __proto__指向函数的prototype
let obj = Object.create(fun.prototype)
// 让构造函数的this指向空对象,运行代码
let res = fun.call(obj, arguments)
// 判断 如果res是一个对象,则说明构造函数中返回了一个对象
return res instanceof Object ? res : obj
}
// new操作符创建对象和字面量创建对象的区别
// new操作符本质上是调用方法,通过在原型链上查找方法然后调用。调用方法时,会产生堆栈信息,
// 调用结束后会释放堆栈信息,性能不如字面量的方式。
</script>