第五章
第5章 JavaScript面向对象
1. 什么是面向对象
这里所说的对象,是从英语object翻译过来。台湾被翻译成物件,大陆翻译为对象。所谓对象,其实就是一个东西。事实上这是站在哲学的角度提出来的一种编程思想。我们的世界就是由各种各样的东西组成的,例如:汽车,建筑,人等各种各样。
以前我们学习C语言的时候,我们说C语言是一门面向过程的语言。例如之前用C语言来做ATM机程序的时候,虽然我们将其拆分为了各个函数,但是始终还是由存钱,取钱等模块组成的,关心的是动作,或者说是行为。但是面向对象就不一样了,我们关心的重点是ATM机这个对象。ATM机这个对象具有存钱,取钱这些功能。这就是区别!
2. 什么是类与对象
所谓类,就是对对象的一种分类。类与对象的关系类似于模具与实在的东西之间的关系。换句话说:我们可以通过类来制造出一个对象。类是一个抽象的概念,而对象是一个实实在在存在的东西
再比如说:一个图书馆有成千上万本书,这些书就可以看做是一个一个对象。但是这些书不是杂乱无章的放在一起的,而是进行了分类。例如历史类,哲学类,小说类。我们可以往某一个类里面添加一本新的书。但是这本书必须就具有该类的特征。
3. 面向对象编程的特点
一般来讲,面向对象编程会被分为3大特点:封装,继承和多态,但是在有的地方,面向对象被分为了4大特点,除了上面的3个以外,还增加了一个抽象。
4. JavaScript面向对象特点
前面所讲的面向对象相关知识就是Java,C#,C++等高级语言的面向对象的思想。但是,JavaScript的面向对象的实现和其他高级语言的面向对象有所不同。JavaScript与其说是面向对象,不如说是基于对象。因为JavaScript里面一切皆为对象。其次,JavaScript里面没有类(class)这个关键字。(在最新的ES6里面已经有了)。
5.JavaScript创建对象
JavaScript中创建对象这里介绍6种。
① 使用object构造函数
object是JavaScript里面所有类的基类。换句话说,JavaScript里面所有的对象都是从object类派生出来的。使用object,可以创建自定义数据类型和对象。最早的程序员就是通过这种方式来创建的。如下:
我们可以给对象添加相应的属性和行为。如下:
这种方式有缺点,我们没有对person这个对象进行封装。这就会导致我们每创建一个对象,就又要书写一次属性和方法,这样子很麻烦。
② 使用对象字面量
也就是我们的JSON(JavaScript Object Notation)。用大括号括起来,用逗号来分隔 属性/值。后面跟一个冒号以及属性值来进行指定。
③ 工厂模式
缺点:(1)它不够正规。因为JavaScript越来越正规。这里没有使用new关键字。(2)还有一个原因就是我们每一个对象都有一个sayName方法。这样子会造成内存的浪费。如下图:
④ 通过构造函数来创建对象
这种方法解决了工厂方法的第1个缺点,但是第2个缺点没有被解决。
⑤ 原型方法
prototype的方法来申明一个共用的属性或者方法
这种原型方法虽然解决了重复生成函数的问题,但是我们可以从代码中看到生成的对象没有差异性,全部都叫Tom
⑥ 组合式(构造函数+原型方法)(需要掌握)
6. 访问对象属性
访问对象属性是通过一个点.来进行访问
除了上面的方法,我们还有一种方法,通过["属性名"]
两种方法相比之下,第二种更加灵活,但是在开发中第一种用得最多。
7. 对象相关操作符
① for-in
作用:用来遍历一个对象,打印出该对象的属性和方法
② instanceof操作符
作用:判断一个对象是否是一个类的实例
③ constructor
作用:查看一个对象的构造函数
效果:
接下来我们来证明一直以来说的那句话:JavaScript里面一切皆为对象
效果:
this关键字
this始终代表调用它的那个对象
练习:
Prototype设置公用的属性和方法
Prototype用于设置对象公共的属性或者方法。
封装
所谓封装,就是将一些属性和方法封装在类里面,外部无法访问。例如生活中的电视机,就是封装最典型的例子。
在JavaScript里面,通过var来对属性和方法进行封装。
封装除了有私有的属性,当然也有私有的方法
继承
所谓继承,就是一个类继承另一个类的属性和方法。
这里举一个例子:例如有两个类,一个猫类,一个狗类,这个时候我们就可以创建一个动物类。然后让猫类和狗类来继承动物类。继承的好处在于不用重复书写代码。
在JavaScript里面,是通过对象冒充来实现的继承。
继承除了通过对象冒充以外,还可以通过call方法
Call的基本使用
通过call来实现继承
Apply方法:这个方法和上面的call方法基本上是一模一样。主要是在一个参数上面的区别
apply和call的用法只有一个地方不一样,除此之外,其他地方基本一模一样
a.call(b,arg1,arg2…)
a.apply(b,[arg1,arg2]) //apply只有2个参数,它将call的参数(arg1,arg2…)放在一个数组中作为apply的第二参数

浙公网安备 33010602011771号