函数与类

prototype

简单地说,JavaScript 是基于原型的语言

当我们调用一个对象的属性时,如果对象没有该属性,JavaScript 解释器就会从对象的原型对象上去找该属性,如果原型上也没有该属性,那就去找原型的原型,直到最后返回 null 为止,null没有原型。这种属性查找的方式被称为原型链(prototype chain)。

new

当 js 语言执行 new 操作时具体时执行的什么操作呢?

  1. 创建一个空对象 u = {}

  2. 绑定原型,u.__proto__ = User.prototypeObjet.setPrototypeOf(u, User.prototype)

  3. 调用 User() 函数,并把空对象 u 当做 this 传入,即 User.call(u)

  4. 如果 User() 函数执行完自己 return 一个 object 类型,那么返回此变量,否则返回 this

    PS:如果构造函数返回基本类型值,则不影响,还是返回 this

箭头函数与普通函数

区别:

  1. 箭头函数不会创建自己的 this:它会从自己的作用域链上继承一个 this
  2. 箭头函数的 this 永远不变:它的 this 在被定义时就已经确定了(call/apply/bind 都无法改变箭头函数的指向);
  3. 箭头函数不能作为构造函数使用(本质是因为 this 无法改变);
  4. 箭头函数没有自己的 argument,没有 prototype
  5. 箭头函数不能使用 yeild 关键字;