- 构造函数的返回值
// 返回值为基础类型
function Super () {
this.name = 'Super'
return 1
}
const sup = new Super()
console.log(sup) // Super {name: 'Super'}
// 返回值为引用类型
function Super () {
this.name = 'Super'
return new Set([1, 3, 5])
}
const sup = new Super()
console.log(sup) // Set(3) {1, 3, 5}
- new 都做了什么
- 首先创建了一个空对象
{}
- 将空对象的原型对象指向构造函数的原型对象
- 改变构造函数的上下文(
this
)为这个空对象 - 处理构造函数的返回值
如果构造函数返回值为基础类型,就忽略返回值
如果构造函数返回值为引用类型,就使用该返回值,new的操作无效
- 代码的简单实现
/**
* Sup是new后边的构造函数
* arg是接收的入参
*/
function newObj (Sup, ...arg) {
const obj = {} // 创建一个空对象
Object.setPrototypeOf(obj, Sup.prototype) // 将obj的原型对象指想构造函数的原型对象
const res = Sup.apply(obj, arg) // 将构造函数的this指向改为obj
return res instanceof Object ? res : obj // 处理构造函数的返回值
}
Object.setPrototypeOf(obj, prototype)
*将一个指定的对象的原型设置为另一个对象或者null(既对象的[[Prototype]]内部属性).