文章目录
原型相关
什么是原型:
每个函数中都会有一个属性——prototype
属性,这个属性指向了一个对象,这个对象就被称为原型对象,简称原型。原型中存储的是通过构造方法创建出来的所有对象可以共享的内容。可以使用构造方法名称.prototype
属性来获取原型对象
组合继承
指借用构造方法继承和原型链继承的组合,通过借用构造方法继承,可以继承上级构造方法对私有属性的绑定和初始化功能,通过原型链继承,可以继承上级构造方法原型中的内容
构造方法的不足
如果将所有的属性和功能都封装到构造方法中,那么当其属性值相同时,势必造成内存资源的浪费(因为构造方法里面的所有东西,会在创建对象时给每个对象身上绑定一份这样的属性)。解决的方法就是将属性值相同的内容放到“公共空间”-----原型
this在原型中的使用:原型中的this代表调用原型内容的对象
为什么对象可以直接获取原型中的内容
是因为,在每个对象的内容会有一个__proto__
属性,这个属性指向了创建该对象时的原型对象。当利用对象去查找某个属性的时候,属性的查找顺序是:先从自身的私有属性中查找,如果私有属性中有要查找的属性,则返回其对应的值,如果私有属性中没有要查找的属性,则沿着__proto__
的指向,到原型对象中查找。如果有则返回其对应的值。如果私有属性和原型中的属性的名称相同,那么私有属性会将原型中的属性屏蔽掉
什么是继承
所谓继承就是在两个构造方法间建立起来的某种关系,通过这种关系,可以让下级构造方法创建出来的对象享用上级构造方法获取原型中的内容,继承的方式主要有:借用构造方法继承、原型链继承、组合继承
注意
:借用构造方法继承,继承的是上级构造方法对私有属性的绑定和初始化功能,不能继承上级构造方法原型中的内容
原型链继承
所谓原型链继承,就上让下级构造方法的prototype
属性指向上级构造方法创建出来的一个实例(对象)
到底什么是原型链
所谓原型链,就是指通过原型链继承,在原型之间建立起来的一条链式结构,我们把这条链式结构称为原型链。当对象在操作属性时,先从自身的私有属性中查找,如果有,则返回对应的属性值,如果没有,则沿着自身的__proto__
属性到它的原型中查找,如果他的原型中也没有,那么就会沿着原型链继续向上查找,如果找到则返回对应的值,如果找到Object原型也没有发现要找的属性,则返回undefined
如果采用原型链继承,就会导致下级构造方法原型中的constructor
属性的指向的改变(constructor
属性时原型中的一个属性,这个属性默认指向它的构造方法,如果采用原型链继承,那么constructor属性的指向就不在指向自己的构造方法了,所以,我们需要将它重新指回自己的构造方法)
原型中,创建的新值,如果在继承,借/原型链上面,会找不到,隐藏(覆盖)
constructor属性
如果采用原型链继承,就会导致下级构造方法原型中的constructor
属性的指向的改变(constructor
属性时原型中的一个属性,这个属性默认指向它的构造方法,如果采用原型链继承,那么constructor属性的指向就不在指向自己的构造方法了,所以,我们需要将它重新指回自己的构造方法)
作用域链
对象的关系可以看作是一条链
原型
只要创建了一个新函数,就会为该函数创建一个prototype
属性,这个属性指向函数的原型对象,访问使用__proto__
原型对象
默认会有一个属性 constructor
原型链:
关系可以看出是一条链
闭包相关
1.从广义讲:被定义在其它函数内部的函数就是一个闭包
2.从狭义将:外部函数返回的持有外部函数变量的内部函数,被称为闭包
闭包的作用
可以将外部函数中定义的变量拿到函数外部来操作,即闭包在它所在的外部函数和全局环境间建立起了桥梁
闭包的工作原理
按道理说,每个函数在执行完毕后会从内存中将该函数弹出,如果函数被从内存中弹出,那么该函数的作用域链由于没有东西对它进行引用,那么这个作用域链就会被销毁,作用域链被销魂,那么该函数的变量对象也就没有被引用,变量对象也会被销毁。闭包之所以可以在外部函数执行完毕后依然能够使用外部环境中的变量,是因为,当外部函数被销毁时,由于闭包中使用了外部函数变量对象中的内容,所以外部函数的变量依然会被保存在内存中。
闭包的不足
由于闭包会将上级作用域下面的变量对象保存在内存中,那么如果程序中有大量的闭包,势必造成内存的资源浪费。建议,在不使用闭包的时候,手动将闭包清除
闭包2种写法
return返回,res接受
闭包,函数包函数
能够读取其他函数内部变量的函数
内部可使用外部的变量
常用:内部函数作为返回值返回
程序当中不要多使用闭包,内存会吃不消,内存泄露,加return的,非一次的