箭头函数是普通函数的简写,可以更优雅的定义一个函数,和普通函数相比,有以下几点差异:
1、函数体内的this
对象,就是定义时所在的对象,而不是使用时所在的对象。箭头函数没有 this,它会从自己的作用域链的上一层继承 this(因此无法使用 apply / call / bind 进行绑定 this 值)
2、不可以使用 arguments 对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
3、不可以使用 yield 命令,因此箭头函数不能用作 Generator 函数。
4、不可以使用 new 命令,因为:
- 没有自己的 this,无法调用 call,apply。
- 没有 prototype 属性 ,而 new 命令在执行时需要将构造函数的 prototype 赋值给新的对象的 __proto__
new运算符的执行过程
- 新生成一个对象
- 链接到原型:
obj.__proto__ = Con.prototype
- 绑定this:
apply
- 返回新对象(如果构造函数有自己 retrun 时,则返回该值)
function new(fn, ...rest) {
var obj = {};
obj.__proto=fn.prototype; // 前两行可以合并一行 var obj = Object.create(fn.prototype)
var res = fn.apply(obj, rest)
return (typeof res === 'objcet') ? res : obj
}