观察下方的代码:
// 常见构造函数
function Person(name) {
this.name = name
}
Person.prototype.getName = function() {
return this.name
}
// new 的模拟方法
const objectFactory = function() {
let obj = new Object() // 从Object.prototype上克隆一个对象
let Constructor = [].shift.call(arguments) // 取得外部传入的构造器
obj.__proto__ = Constructor.prototype // 指向正确的原型
let ret = Constructor.apply(obj, arguments) // 借用外部传入的构造器给obj设置属性
return typeof ret === 'oject' ? ret : obj // 确保构造器总会返回一个对象
}
测试:
const a = objectFactory(Person, 'Tom')
const b = new Person('Tom')
Object.getPrototypeOf(a) === Person.prototype // true
至此我们发现objectFactory与new关键字产生了相同的效果