Skip to content

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())