实现
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、一个需要注意的点,构造函数如果存在返回值,并且返回的值是一个对象,那么通过构造函数所实例化出的对象,只能继承到返回的对象
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
}
试验一下我们的结果
总结
这样,我们就实现了一个工厂模式的 new 方法。