积跬步,至千里。
new的原理
- 原理解析
new关键字创建实例的过程:
- 创建一个新的空对象
- 将新的空对象的
__proto__属性指向原构造函数的prototype - 改变this,指向新的空对象,执行函数并将结果保存
- 判断函数执行结果有没有返回值对象,如果有则返回该结果,若没有返回新的空对象
- 结合实例
function NewObj(fn) {
// 创建一个新的空对象
const obj = {}
// 将新对象的__proto__属性指向原构造函数函数的property
obj.__proto__ = fn.prototype
// 改变this指向,指向obj,并执行保存结果
const res = fn.call(obj)
// 判断执行结果是否返回其他对象
if (typeof res === 'function' || typeof res === 'object') {
return res
}
return obj
}
箭头函数不可以使用new
-
剖析
箭头函数与普通函数相比,其没有
prototype、没有自己的this指向、不可以使用arguments -
原因
- 箭头函数没有
prototype属性,而new内部需要调用原函数的prototype属性 new内部有改变this指向的操作,但是call()、bind()、apply()对箭头函数没有作用。箭头函数的this是定义时所在的对象,而不是使用时所在的对象,无法改变
- 箭头函数没有