new的实现
js
// 1. 首先创建一个空对象
// 2. 将空对象的隐式原型指向构造函数的原型
// 3. 让构造函数内部this指向新创建的空对象,并执行
// 4. 返回这个对象(实例对象)【如果传入的方法有return,则判断他是对象还是基本数据类型, 如果是对象直接返回执行后的结果,否则返回返回实例对象】
function myNew(Fn, ...arg) {
let obj = {} // 1
obj.__proto__ = Fn.prototype // 2
// let obj = Object.create(Fn.prototype) // Object.create创建一个空对象并把空对象的隐式原型指向传入的对象
let res = Fn.apply(obj, arg) // 3
//typeof(null)返回的类型是object,但是在new中返回的是实例对象,所以要排除掉
return (typeof(res) === 'object' && res !== null) ? res : obj // 4
}
function People(name, age) {
this.name = name
this.age = age
}
People.prototype.getName = function () {
return this.name
}
// let tom = myNew(People, 'tom', '18')
// console.log(tom.name)
// console.log(tom.age)
// console.log(tom.getName())