ECMAScript中,对象是一个无序属性集,这里的“属性”可以是基本值、另一个对象或者函数
。实际应用可以理解为一本书,一个人,一个班级,所以万物都是对象。对象的属性怎么理解,以人为例,指人的名字、身高、体重等等,对象的属性还可以是函数称之为方法,指代对象的一些操作,动作。如人的说话,走路等等。
面向过程
假设现在项目需求为画一个三角形,一个矩形。直接编写代码时,我们肯定考虑的是第一步 画三角形, 第二步 画矩形。我们会编写一个三角形函数triangle() 一个矩形函数rect() 然后一步步调用,这是面向过程的思想。
function triangle() {...}
function rect() {...}
triangle();
rect();
面向对象
面向对象中我们首先会抽象问题,矩形三角形都是对象,他们的类型都是形状。他们有各自的边长顶点,那么我们会先创建一个基本对象 形状 Shape属性有顶点、边长,三角形和Triangle和矩形Rect都是基本对象扩展出的新对象,有各自的画图方法draw(),然后用对象得到具体的指向对象(即实例,后文解释)triangle调用draw方法
function Shape() {...}
function Triangle() {...}
function Rect() {...}
let triangle = new Triang();
triangle.draw();
let rect = new Rect();
rect.draw();
面对一个问题,面向过程的思路是第一步做什么,第二步做什么 面向对象则需要先分析出问题中的对象都有什么,对象的属性、方法是什么,让对象要做什么。
假设现在需要获得画出矩形的边长,面向对象中只需要在Rect中加上一个方法就可以,面向过程则需要拿到画出的矩形,再得到边长,相比较而言面向对象易于扩展。
面向对象中有三大特征,封装,继承,多态。封装指将变化封装起来,外面调用时不需要知道内部的实现,继承指的是一个对象可以共享父级对象的一些属性,比如上文的问题中,形状Shape有顶点这个属性,三角形和矩形都可以继承该属性而不需要再重新定义。多态指的是封装之后的变化如何处理,比如上文中将draw函数放在形状Shape中,内部实现就是连接点,三角形和矩形调用父级对象的draw,三角形与矩形的顶点不同。
为什么要使用面向对象?面向对象因为封装,继承,多态的特征使程序更易于扩展,维护,重用。比如在另外一个环境中我们需要画三角形,我们只需要将三角形这个对象及形状父级对象引入,剩下关于三角形的操作都是三角形这个对象的内部实现。维护起来去该对象的该方法找错,比在整个环境中找三角形函数要好很多。