js基础
一、原型与原型链
因为es6以前,面对对象通过把公有属性和方法放到构造函数里实现,但多个方法放到构造函数里会单独多个开辟内存空间,这样就浪费了内存。
1、构造函数原型prototype
放在构造函数原型里的方法是所有对象所共享的。
JavaScript规定,每一个构造函数都有一个prototype属性, 指向另一个对象。注意这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有。
所以我们可以把公共方法放到构造函数的原型对象prototype,所有函数的实例化都可以使用这个方法,就不会造成内存浪费。
2、对象原型__proto__
我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象都会有一个属性__ proto__指向构造函数的 prototype原型对象
简单总结原型对象:在JavaScript中,每个构造函数都有一个原型对象存在,这个原型对象通过构造函数的prototype属性来访问
利用原型对象,可以实现为所有的实例对象共享实例方法,不仅节省了内存,还体现了实例对象之间的联系。我们可以将实例方法定义在原型对象中,然后所有的实例方法就都可以访问原型对象的方法了。因此,原型对象其实就是所有实例对象的原型。
总结构造函数、实例、原型对象三者关系图:
3、原型链
简单总结,在JavaScript中,对象有原型对象,原型对象也有原型对象,这样就形成了一个链式结构,称为原型链
二、作用域链
简单来说: 作用域就是限制某个变量只能在某个区域有效
javascript会先看函数内有没有这个变量a,如果没有再去函数的外围看有没有这个变量
作用域链只能向上查找,最终找到全局。不能同级(局部)或者向下查找
ES6
一、闭包
基于函数作用域,闭包是为了能在一个函数内部也有限权访问另一个函数内部的变量本质就是在一个函数内部创建另一个函数。
闭包作用:①:延长局部变量生命周期
②:可以让函数外部操作到函数内部的数据
③副作用:内存泄露(原因:引用的变量没有被销毁,而是重复创建)
总结闭包好处与坏处