js手写版new
new的功能
通过构造函数来创建一个实例对象,并且原型指向这个构造函数
new的过程经历
- 创建一个空对象
- 改变这个对象的原型指向
- 声明一个变量接收改变this指向空对象的函数指向的结果
- 返回 声明的变量 或者 对象
手写new
function myNew(Fn, ...args) {
//对应步骤一
let obj = {}
//对应步骤二
obj.__proto__ = Fn.prototype
//通过apply 来执行
//apply是改变this 并执行
let res = Fn.apply(obj, args)
//判断构造函数的返回值是否是对象 如果是 就返回对象 否则返回 new里的obj对象
if (res instanceof Object) {
return res;
} else {
return obj;
}
}
function Fun(name){
this.name = name
}
let list = myNew(Fun,'小陈')
执行结果
ok到这里简单的 手写new就实现了 我们来看一下 原版new
发现是一致的
现在补充解释 new中的一个判断到底是什么意思
当在new时 没有返回值的函数 默认返回undefined
当返回值是一个 对象类型的话 就把返回值给你 而不是把 new的实例化给你
引用类型都是对象 null也是对象 有句话说的好万物皆对象 大家有空可以调它们的原型 就可以在原型上找到了