// 实现一个new操作符
// new执行时做了什么
/*
1.创建一个新对象
2.将构造函数的this指向这个对象
3.执行这个函数
4.返回这个对象
*/
function myNew(fn) {
// 1.创建一个新的对象,并把这个对象的__proto__指向构造函数(fn)的原型
let obj = {
__proto__: fn.prototype
}
// 这里分为两步
// 第一步是获取传进来的参数中除了第一个之外的
// 2&3.第二步是用apply方法改变fn的this指向,并将剩余参数传入执行fn
let res = fn.apply(obj, Array.prototype.slice.call(arguments, 1))
// 进行判断,如果fn的返回值是一个对象则返回这个对象,否则返回新对象
if ((typeof res == 'function' || typeof res == 'object') && typeof res !== null) return res
// 4.返回obj
return obj
}
// 进行验证是否成功
function Person(name, age, on) {
this.name = name
this.age = age
this.no = on
// return {
// name: 'ls'
// }
}
const p = myNew(Person, 'zs', 18, '被抓')
console.log(p) // Person {name: "zs", age: 18, no: "被抓"}
完