什么是面向对象:在不需要知道它内部结构和原理的情况下,能够有效的使用它,比如,电视、洗衣机等也可以被定义为对象
什么是对象:在Java中对象就是“类的实体化”,在JavaScript中基本相同;对象是一个整体,对外提供一些操作
什么是面向对象:使用对象时,只关注对象提供的功能,不关注其内部细节,比如JQuery
面向对象是一种通用思想,并非只有编程中能用,任何事情都可以用
JS中的面向对象:
面向对象编程(OOP:orient object programming)的特点:
抽象:抓住核心问题,找出自己需要的、跟问题相关的或最主要的属性,把他抽离出来
封装:不考虑内部实现,只考虑功能使用,把自己需要用的功能对象进行封装。
继承:从已有对象中,继承新的对象,即从父类上继承出一些方法、属性,子类,又有一些自己的特性;有多重继承(同时继承两个或多个父级)、多态(不太常用,对于C/C++、Java等强语言比较有用,但是对于JS这种弱语言意义不大)。
对象的组成:
方法——我们之前常叫做函数:过程、动态的
属性——我们之前常叫做变量:状态、静态的
对象组成
1 2 3 4 5对象组成2 6 17 18 19 20
第一个面向对象程序:
为对象添加方法和属性
this(当前发生事件的对象)详解,事件处理中this的本质
window:全局方法属于window下的,如下:
所以说,this——当前的函数属于谁,this就表示谁
注意:不能在系统对象(如Date-日期对象、Array-数组对象、RegExp-正则)中随意附加方法、属性,否则会覆盖已有方法、属性,当我们想要创建自己的对象,且不想要系统额外附加的方法、属性等时,我们可以选择object对象,如下:
object对象:其优点是没有功能,相当于一张白纸,你可以随意写、画,而且还能有效避免与系统属性或方法产出冲突。下面下一个简单的“面向对象程序”如下:
面向对象两种实现方式:
① 工厂方式
什么是工厂:原料、加工、出厂
工厂方式:
用构造函数创建一个类:(构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象赋初始值,总与new一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的。 ——百度百科)
什么是类、对象(实例):模具和零件
工厂方式的问题:
没有new
函数重复定义:造成资源浪费
加上new
偷偷做了两件事
替你创建了一个空白对象
替你返回了这个对象
new 和 this
1 2 3 4 5第一个面向对象程序 6 78 79 80 81
② 原型——prototype
什么是原型
原型是class,修改他可以影响一类元素,即一次给一组元素添加样式,原型就相当于CSS中的class(在JS中叫做“原型”),而与此相对的CSS中的行间样式(在JS中相当于“给对象添加事件”):一次只能给一个元素添加样式
在已有对象中加入自己的属性、方法
原型修改对已有对象的影响
为Array添加sum方法
给对象添加方法,类似于行间样式
给原型添加方法,类似于class
1 2 3 4 5原型简介 6 26 27 28 29
1 2 3 4 5原型用到面向对象里 6 37 38 39 40
总之,在我们编程的时候,基本套路就是“在构造函数里添加属性,另外用原型添加方法”
原型的小缺陷:
无法限制覆盖
类和对象对比:
类:模子——不具备实际功能,用于生产产品
对象:产品(产品):具备实际功能,就是实际产品
例如:类Array Array.push(); //错误语法,因为Array是类,不是对象;
对象 new arr() //错误语法,因为系统不存在arr类
所以,其实原型之所以类似于CSS中的类,是因为它的方法是添加到类上的,即直接给一类“对象”添加方法
还有,流行的面向对象编写方式
用混合方式构造对象
混合的构造函数/原型方式(Mixed Constructor Function/Prototype Method)
原则
构造函数:加属性
原型:加方法
对象命名规范
类名首字母大写