class
定义类,构造实例。是ES6语法规范。
继承
利用super()继承父类中的constructor()
类型判断-instanceof
{} instanceof Object //true
原型
每个class都有显式原型prototype;每个实例都有隐式原型-proto-;实例的-proto-指向对应class的prototype
基于原型的执行规则
想获取某个实例对象的属性或执行方法时,先在实例对象自身的属性和方法中找,如果找不到则自动去-proto-中查找
原型链
手写简易JQuery
创建一个包含属性和方法的类,实例化。即可调用其中的方法和属性。
题目:创建10个<a>标签,点击的时候弹出来对应的序号
let i, a
for(i=0;i<10;i++){
a=document.createElement('a')
a.innerHTML=i+'<br>'
a.addEventListener('click',funtion(e){
e.preventDefault()
alert(i)
})
document.body.appendChild(a)
}
//当click点击时,由于i是在全局作用域下定义的,此时i已经变成10了
//解决方法如下:
let a
for(let i=0;i<10;i++){
a=document.createElement('a')
a.innerHTML=i+'<br>'
a.addEventListener('click',funtion(e){
e.preventDefault()
alert(i)
})
document.body.appendChild(a)
}//let放在这里,每次循环就会形成一个新的块级作用域
作用域
全局作用域;函数作用域;块级作用域(ES6新增,目前使用)
自由变量
一个变量在当前作用域没有定义,但被使用了,则向上级作用域,一层一层依次寻找,直至找到位置 ,如果全局作用域都没找到,则报错xx is not defined
闭包
闭包(closure)指有权访问另一个函数作用域中变量的函数。简单理解就是一个作用域可以访问另外一个函数内部的局部变量。主要作用:延伸了变量的作用范围。
作用域应用的特殊情况有两种表现:函数作为参数被传递;函数作为返回值被返回。
闭包中自由变量的查找,是在函数定义的地方向上级(方)作用域查找,而不是在执行的地方。
//函数作为参数被传递
function print(fn) {
const a = 200
fn()
}
const a = 100
function fn() {
console.log(a)
}
print(fn) //结果为100
this
应用场景:作为普通函数调用;使用call、apply、bind去调用;作为对象方法被调用;在class方法中调用;箭头函数。
this取什么值是在函数执行的时候确认的,而不是在函数定义的时候确认的,适用于以上五种场景
定时器中this指向window,箭头函数的this指向的是它上一级的this,类里面的this指向的是constructor
手写bind函数
//模拟bind
Function.prototype.bind1 = function () {
//将参数拆解为数组,调用如下方法可将一个列表转成一个数组,slice是Array原型上的一个api,
//call则通过slice函数执行的时候把arguments的值赋给Array.prototype.slice的this
const args = Array.prototype.slice.call(arguments)
//获取this(数组第一项),.shift把数组第一个元素取出来,改变原数组
const t = args.shift
//fn1.bind(...)中的fn1
const self = this
//返回一个函数
return function() {
return self.apply(t,args)
}
}
bind()方法创建一个新的函数,当这个新的函数被调用时,其this值置为提供的值,其参数列表前几项置为创建时指定的参数序列
实际开发中闭包的应用
闭包隐藏数据,只提供API。闭包中的数据被隐藏,不被外界访问,只能通过api:set/get设置和读取