你不知道的js(二)

  • 作用域与闭包

  • this与对象原型

  • 类型与文法

  • 异步与性能

  • ES6与未来

this与对象原型

this是什么

  • this是运行时绑定的,依赖于函数调用的上下文条件,与定义无关,与函数调用的方式有关,执行环境的活动记录中存在this的引用

this豁然开朗

  • 如何判定this
    • 函数是否是通过new调用,如果是,this就是新构建的对象
    • call/apply绑定,this为绑定的对象
    • 对象调用,this为调用的对象
    • 默认绑定,如果是严格模式为undefined,否则为global对象
  • 绑定的特例
    • 如果null/undefined作为call/apply/bind的this,那么会忽略掉
    • (p.foo = o.foo)() 如此间接调用会采用默认调用
    • 词法this 箭头函数,只与定义时候的环境有关

对象

  • 属性名为字符串或Symbol
  • 对象的拷贝
    • 浅拷贝 复制对于value的引用
    • 深拷贝 复制value引用的内容
  • 属性描述符
    • value 值
    • writable 可写性
    • enumerable 可枚举性
    • configurable 可配置性
  • 对象的不可变性实现
    • 对象常量 writable+configurable = false
    • 防止扩展 Object.preventExtensions
    • 封印Seal configurable = false +防止扩展 Object.seal
    • 冻结Freeze 封印+对象常量
  • 对象的存在性
    • in 是否存在于对象及原型链中
    • hasOwnProperty 是否存在于对象中
    • 枚举 对象的属性在迭代时是否会包含在内
      • 区分 propertyIsEnumerable
      • Object.keys 返回所有可枚举属性数组 针对当前对象
      • Object.getOwnPropertyNames 返回所有属性的数组包括不可枚举的类型 针对当前对象
  • 迭代
    • 定义对象的Symbol.iterator可以使对象可以调用迭代的方法如for of

混合类的对象

  • js中不存在类,类是一种设计模式,在js中可以去模拟类,会存在拷贝的问题

原型

  • 设置与遮蔽属性
    • 1 如果在原型链中并且可以writable 则会在原对象中创建赋值
    • 2 如果writable:false 则忽略赋值操作
    • 3 如果在原型链中找到并且是setter 则调用setter,不会在原对象中进行操作
    • 如果遇到上面2/3的情况,则需要使用Object.defineProperty 去添加属性
  • fn.isPrototypeOf(a) 判断a是否是fn的实例 getPrototypeOf() 获取原型链

行为委托

  • 实际上就是利用原型链进行方法的继承管理,是一种没有类的抽象,基于原型链的行为委托