你不知道的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() 获取原型链
 
行为委托
- 实际上就是利用原型链进行方法的继承管理,是一种没有类的抽象,基于原型链的行为委托