this本质;类的模拟;HACK;

书摘&心得

箭头函数用当前词法作用域覆盖了this

1 关于this

  • this被用来隐式传递对象的引用,一个默默的快递员
  • 误解:this指向自身,this指向它的作用域
  • 在哪生(苏州)不重要,在哪用(南京)也不重要,重要的是谁(公司)在用

    2 this全面解析

  • 隐式绑定:this指向调用函数的对象(分配就业)

    • 严格模式下全局对象无法使用默认绑定,this会指向undefined(没公司的孩子像根草)
  • 丢失this(各种跳槽)【86】
    • 给函数取别名,通过别名调用函数时,this指向调用别名的对象(跳槽)
    • 回调函数也是在给函数取别名,某些库甚至会改写this,绑定到触发事件的元素DOM上(被跳槽)
    • 其实就是第一条,this指向调用函数的对象
  • 显示绑定(主动就业)

    • 函数都具有方法call和apply,传入的第一个参数是对象(是函数的新老板)
    • call和apply可以一时解决this问题,但是在回调函数和别名情况下,this即使绑上了也会二次丢失。
    • 使用硬绑定可以解决一切,返回值是一个脱胎换骨的新函数,绝不会丢失绑上的this【89】
    • 传入null或undefined不会改变原this指向

      3 对象

  • 公司、人

  • 函数是对象的一等公民,是复杂一些的对象(是人)
  • 简单基本类型不是对象。(不是人也不是公司,是一种抽象概念,如【交互研发部】)
  • 内置对象子类型就是内置函数
    • 某些情况下简单基本类型会被转换成内置对象子类型(狸猫换太子?)
  • 属性、函数、方法【107】
    • 属性名是string类型,是公司的部门名
    • 函数是员工
    • 员工签订的是劳动合同(指针)而不是卖身契
    • 上班的时候我属于公司,是方法;下班的时候我变回自己,是函数。
  • Object.assign只复制键与键值,不复制对象本身的属性。
  • 属性描述符
    • 公司的特性(是否加班?是否500强?)
    • 对象是否可写?可改?可枚举?
  • 对象冻结是深度冻结,可能会影响共享的对象。【115】
  • [[Get]] [[Put]] Getter Setter

    • 默认调用[[Get]] [[Put]]
      • 属性访问实际上在调用[[Get]]【116】
      • 属性赋值调用[[Put]]。
    • 访问描述符调用Getter和Setter【117】
      • 如果一个属性有Getter和Setter的话,它就是访问描述符
      • Getter和Setter重写了默认的[[Get]][[Put]],它们成对出现

        4 混合对象——类

  • 什么是类

    • 类意味着复制
    • 类是一种设计模式,是可选的。其他语言选择强制使用类,但是javaScript并不是
    • 在其它语言中,类和实例就好像蓝图和建筑,构造函数是两者的接口
  • javascript与类
    • javaScript中只有对象,不存在可以被实例化的“类”
    • js中函数难以真正的复制,共享的是函数的引用,是委托【138】
    • “混入”是一种模拟类的方法,但是得不偿失【141】
  • ES6与类【189】

    • 上面的问题都是ES6之前的事了
    • 除了牵一发动全身,毕竟不是真的复制,还是引用,修改了父类会影响子类
    • super函数会把当前类的老板变成父类的老板。
    • 不是真正的抽象,仍然是一个对象

      5 原型链与HACK

  • 原型对象是js中的“类”,但本质上是对象。【194】

    • 原型对象是动态的,可以修改,不像类是静态的。
    • 修改原型对象就等同于修改所有小弟,是HACK的基础。
  • 原型对象的小弟们(都是特权方法)【红宝书187 188】
    • constructor是原型对象的一个小弟,是一个函数。【Input】
      • 调用constructor构造出来的还是一个对象(实例)【
      • 修改constructor可以修改所有小弟,是函数式组件HACK的基础。
    • 使用class创建的类是一个原型对象。
      • 独有的render是一个小弟,挂在原型对象上,是普通组件HACK的基础。
  • 【HACK实现】特权方法有权访问/修改同一作用域的一切方法、属性
    • 写在构造函数里(Modal的hack)【红宝书187】
    • 挂在原型链上(Input的hack)【红宝书188】