new
- 创建一个空对象
- 将它的引用赋给 this,继承函数的原型。
- 通过 this 将属性和方法添加至这个对象
- 将构造函数添加到原型上
- 最后返回 this 指向的新对象,也就是实例(如果没有手动返回其他的对象)
/*
fn:构造函数
args :执行构造函数的输入参数
*/
function myNew(fn,...args){
// 1.创建一个空对象
const obj = {};
// 2.改原型,将该对象的__proto__属性链接到构造函数的原型对象
obj.__proto__ = fn.prototype
// 4.将构造函数添加到原型上
obj.__proto__.constructor=fn
// 4.执行构造函数,将该对象作为this上下文调用构造函数并接收返回值
const res = fn.apply(obj,args);
// 5.返回新对象(需要判断构造函数返回值类型)
return typeof res === 'object' ? res : obj;
}
构造函数返回值
传统语言中,构造函数不应该有返回值,实际执行的返回值就是构造函数的实例化对象。 js中构造函数可以有返回值,也可以没有返回值。
- 没有返回值,返回实例化对象
- 有返回值
- 返回值是基本数据类型,返回实例化对象;
function f(){
this.name='coco'
//return 0
//return '0'
// return true
// return null
// return undefined
// return Symbol('symbol')
return 1n
}
let obj=new f()
- 返回值是引用数据类型,返回引用类型。
function f(){
this.name='coco'
//return {name:'lily',age:1}
return ['coco',1]
}
let obj=new f()