JS基础,实现 new 方法

272 阅读1分钟

实现

1、首先,创建一个空对象,将空对象暴露出去

const newFactory = function () {
    let obj = {}

    return obj
}

2、获取到第一个参数,第一个参数为创建实例所需要的构造函数

const newFactory = function () {
    let obj = {}

    const constructor = Array.prototype.shift.call(arguments)

    return obj
}

3、将新创建对象 obj 的 proto 指向构造函数的原型属性

const newFactory = function () {
    let obj = {}

    const constructor = Array.prototype.shift.call(arguments)

    obj.__proto__ = constructor.prototype

    return obj
}

4、将 constructor 的 this 指向到新创建对象 obj 上

const newFactory = function () {
    let obj = {}

    const constructor = Array.prototype.shift.call(arguments)

    obj.__proto__ = constructor.prototype

    constructor.apply(obj, arguments)

    return obj
}

5、一个需要注意的点,构造函数如果存在返回值,并且返回的值是一个对象,那么通过构造函数所实例化出的对象,只能继承到返回的对象

image.png

6、 根据上述,改造一下我们的 newFactory

const newFactory = function () {
    let obj = {}

    const constructor = Array.prototype.shift.call(arguments)

    obj.__proto__ = constructor.prototype

    const result = constructor.apply(obj, arguments)

    return typeof result === 'object' ? result : obj
}

试验一下我们的结果

image.png

总结

这样,我们就实现了一个工厂模式的 new 方法。