模块之间相互调用,理清关系作用域
this的不同应用场景如何取值
手写bind函数
闭包的应用场景,复杂情况常用
10.实际开发中闭包的应用场景,举例说明
②函数防抖 ③使用闭包设计单例模式 ④设置私有变量
隐藏数据,不让外边去改变
做一个简单的cache工具:只能通过返回的函数改变对象属性(这个函数能访问定义时作用域的变量),无法直接修改
创建10个a标签点击时弹出相应序号
知识点
1. 作用域和自由变量
作用域:变量的合法使用范围:全局,函数,块级(ES6作用域)
自由变量:一个变量在当前作用域没有定义但被使用了
向上级作用域一层一层依次寻找,直至找到为止,到全局都没有就返回undefined
1. 闭包
作用域应用的特殊情况 : 函数定义的地方和函数执行的地方不一样
- 函数作为参数被传递
- 函数作为返回值被返回
所有自由变量的查找是在函数定义的地方不是在执行的地方
1. this
- 普通函数
- call apply bind
- 作为对象方法被调用
当前对象
定时器里面函数执行this是window,因为相当于赋值给了新的变量由定时器来执行函数
- class方法中被调用
创建的实例
- 箭头函数
永远取上级作用域的this,本身不决定this
this取值是在函数执行时确定而不是在定义时确定
JS是基于原型继承的语言
如何判断一个变量是不是数组(instanceof 原理)
instanceof Array,Array.isArray,Object.prototype.toString.call()
手写jQuery,考虑插件和扩展性(学习jQuery的设计方式)
class的原型本质的理解
ES5继承怎么实现属性隔离
知识点
- class和继承
super这个关键字,既可以当作函数使用,也可以当作对象使用。
第一种情况,super作为函数调用时,代表父类的构造函数。ES6 要求,子类的构造函数必须执行一次super函数。作为函数时,super()只能用在子类的构造函数之中,用在其他地方就会报错。`super()在这里相当于A.prototype.constructor.call(this)` 返回的是子类B的实例
第二种情况,super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类。在子类普通方法中通过super调用父类的方法时,方法内部的this指向当前的子类实例。`实际上执行的是super.print.call(this)。` this指向子类实例,所以如果通过super对某个属性赋值,这时super就是this,赋值的属性会变成子类实例的属性。
Class 作为构造函数的语法糖,同时有prototype属性和__proto__属性,因此同时存在两条继承链。__proto__指向对应的构造函数的prototype
子类的__proto__属性,总是指向父类。
子类prototype属性的__proto__属性,总是指向父类的prototype属性。
作为一个实例,子类(B)的原型(__proto__属性)是父类(A);作为一个构造函数,子类(B)的原型对象(prototype属性)是父类的原型对象(prototype属性)的实例。
- 类型判断instanceof
前一个操作符的__proto__能不能对应到后一个操作符的prototype,而一个class的__proto__是父类,父类的__proto__最终指向Object.prototype
ECMA不规定如何实现,只规定语法规则
- 原型和原型链
画图 标题是prototype,key是__proto__指向上一个prototype
实例__proto__和构造函数(class)的prototype指向同一个对象(存放方法)
1. 先找自身属性和方法
2. 找不到则去__proto__
原型链:实例上没有去__proto__上找去了构造函数的prototype,构造函数的prototype上没有,继续找__proto__就是父类的prototype,也就是父类实例的__proto__,原型链顶部是Object.prototype有toString,valueOf等方法,它的__proto__指向null