1、对象:程序中描述现实中一个具体事物的属性和方法的结构
2、面向对象(OOP)
面向对象程序中,描述一个具体事物都要用对象来封装事物的属性和功能,写任何程序都要先找对象,再识别对象的属性和功能;
面向对象编程技术的关键性观念是它将数据及对数据的操作行为放在一起,作为一个相互依存、不可分割的整体——对象。对于相同类型的对象进行分类、抽象后,得出共同的特征而形成了类。面向对象编程就是定义这些类。
面向对象三大特点:
封装:将描述一个事物的属性和方法集中定义在一个对象中;
Why:单独的属性和方法是没有意义的,只有放在对象上才有意义
便于反复调用——代码重用,便于维护
多态:重写(实现子对象与父对象的差异)和重载(便于调用)
重写:如果子对象觉得父对象的方法不好用,可以在子对象定义同名方法, 就会覆盖父对象中的同名方法
重载:相同名称,不同参数列表的多个函数;在调用时可根据传入参数的不 同,动态选择对应的函数执行;
虽然js语法默认不支持重载,但可用arguments对象(类数组对象, 调用时自动创建并接收所有传入的参数值)模拟重载效果;
何时使用重载:只要多个操作共用同一个函数名时
继承:父对象中的属性和方法,子对象可直接使用
Why:代码重用,节约内存空间,便于维护
Js中的继承都是通过原型(_proto_)实现的
3、作用域与作用域链
作用域:一个变量的可用范围,实际就是变量的实际存储位置;
作用域的本质:EC对象(执行环境对象)的一个scope属性,引用了window或AO对象(活动对象,专门保存本次函数调用时的局部变量),只可能是window中(全局作用域——全局变量)或AO中(函数作用域——局部变量);
作用域链:以当前EC的scope属性为起点依次引用每个AO,直到window结束,形成的多级引用关系。(只要在作用域链上存在的变量,当前函数都可使用)
4、原型和原型链
原型:prototype,保存所有子对象共有属性值的父对象。(每个(构造)函数都自带一个prototype对象,所有被构造函数创建的子对象都有一个_proto_属性指向构造函数的prototype对象)
原型链:由各级子对象的_proto_属性连续引用形成的结构,所有对象都有_proto_,所有对象原型链的顶部都是Object.prototype
5、闭包
闭包:内外层函数嵌套;内层函数必须使用了外层函数的局部变量;外层函数将内层函数返回到外部,可以在外部调用;
何时使用闭包:想反复使用一个局部变量,且不希望被污染时,就要用闭包结构保护局部变量。
闭包缺点:比普通函数占用更多的内存空间(外层函数的AO)
如何使用闭包:3步
a、定义外层函数(工厂函数); 特点:定义了受保护的局部变量 返回一个专门操作局部变量的内部函数对象
b、调用外层函数(工厂函数),获得返回的内部函数对象;
c、使用获得的内部函数对象,操作受保护的局部变量——唯一途径;