代码1
function FactoryModel(name,age,sex) {
var obj = {
name,
age,
sex
}
this.obj = obj
return obj //看这里
}
FactoryModel.prototype.printName = function () {
console.log(this.obj.name)
}
var factoryModel1 = new FactoryModel('零三', 18, '男')
factoryModel1.printName()
然后会发现报错 factoryModel1.printName is not a function
function FactoryModel(name,age,sex) {
var obj = {
name,
age,
sex
}
this.obj = obj
return 1 //看这里
}
FactoryModel.prototype.printName = function () {
console.log(this.obj.name)
}
var factoryModel1 = new FactoryModel('零三', 18, '男')
factoryModel1.printName()
运行并不会报错
代码1输出 factoryModel1
代码2输出 factoryModel1
根据以上对比差别在于被new的对象,它return的内容是不同的,思索良久,答案就在new底层原理,来看一下new底层执行了什么逻辑
function _new(fn,...arg) {
const obj = Object.create(fn.prototype)
const ret = fn.apply(obj,arg)
return ret instanceof fn ? ret : obj
}
显然,这就很明白了
对于ret instanceof fn为true 它返回的是函数本身
而函数有原型属性,后续通过prototype进行挂载的内容可以成功被挂载
对于ret instanceof fn为false的,它则返回obj,而obj并没有prototype,所以导致后续未挂载成功,最后运行的时候就找不到挂载的方法