首先一般写构造函数的时候,里面没有用到return,但是也可以有return
因为构造函数也是一个函数, 自然也可以有return语句, 不过和一般函数不太一样的是, 在构造函数中如果return的是一个对象, 则会直接返回这个对象, 如果return 的不是一个对象, 那在new时会忽略这个retrun, 转而返回this对象.
比如下列代码:
function person (name){
let a = 1
let obj = {}
obj.name = name
obj.getName = ()=>{
console.log(this);
}
return obj
}
let p = new person('李四')
console.log(p);
会输出obj对象
但是如果返回的是a,
function person (name){
let a = 1
let obj = {}
obj.name = name
obj.getName = ()=>{
console.log(this);
}
return a
}
let p = new person('李四')
console.log(p);
那么就是这个实例对象p,只不过暂时p中啥也没有
而且return null 或者return ture 或者renturn undefined都是一样的,只有return对象的时候才是对象,当然包括数组和函数,都可以被输出
function person (name){
let a = 1
let obj = {}
let obj_null = null
let array = [1,2]
let fn = ()=>{
console.log('function');
}
obj.name = name
obj.getName = ()=>{
console.log(this);
}
// return obj_null
// return obj
return fn
return array
return undefined
return true
return a
}
let p = new person('李四')
console.log(p);
所以下面是手写的代码
function myNew(Fn, ...args) {
// 把构造函数Fn的原型对象,放在一个新的空对象上的__proto__上
let instance = Object.create(Fn.prototype)
// 此时的instance还是一个空对象,不过有__proto__属性
//Fn.apply(instance , args)相当于是instance.Fn(arg)
// 即是用instance来调用Fn构造函数,毕竟es5的构造函数也是函数
// 里面有一些需要立即执行的代码。就像es6里class里面的constructor一样
// 通过apply来改变this指向,让其指向instance
let res = Fn.apply(instance, args)
// 如果Fn构造函数里会return一个对象,则new后要返回该对象
// 如果是return一个非对象,则new会忽略这个return,而返回这个实例对象
return typeof res === 'object' ? res : instance
}