欢迎光临散文网 会员登陆 & 注册

JS中面向对象介绍

2020-05-15 15:26 作者:MagnumHou  | 我要投稿

一、面向对象编程

1.1 面向对象概述

要理解面向对象,就要理解什么是 面向过程。

面向过程注重的是解决问题的步骤,利用函数去实现每一步过程,没有类和对象的概念,常见的面向过程的语言 C 语言。

面向对象注重使用对象去解决某一个问题,具有类和对象的概念。类是抽象的,注重的是一类的东西,比如说人类、鸟类、猫科等等,从这些类中拿到具体的对象,对象就是一个比较明确的个体,利用这个对象去解决针对性的问题。面向对象语言目前比较流行,像 Java、C++、PHP、Python等等。

也就是面向过程需要调用着去实现各种功能函数,然后调用这些函数;而面向对象,是将一些功能方法在对象中实现,调用者只需要调用这个对象,而不需要了解对象中的功能实现的具体细节。

如:前面学过内置对象 数组Array  字符串String   算术Math   正则RegExp等等,对象中内置了很多的方法,我们在使用的时候,只需要根据对应的功能去调用这些方法即可,而不需要知道这些方法所实现的细节。

假设:给一个数组,进行倒叙排序  注意不能使用数组中reverse()方法

这个时候,就需要自己封装函数实现倒叙的功能。每个人去实现自己这个倒叙功能时,其中的实现细节是不一样的,这就是瞄向过程。而如果我们直接调用数组对象的reverse()方法,根本不需要管reverse()封装的细节,直接拿过来调用即可,这就是面向对象。

再举例:

比方说你是一个单身狗,回家需要吃饭,吃饭就得做饭,吃上饭的流程:选择菜市场 --> 挑菜 --> 回家 -->  摘菜  --> 洗菜 -->  切菜  -->  炒菜  -->  上桌  -->  吃(一个人) -->  刷锅洗碗    此时,所有的步骤都需要自己去完成,这就是面向过程。

long long ago....,这个时候你终于有了对象,再差点有了好基友和闺蜜,这个时候两个人吃饭,吃饭的流程:你下班在家打游戏,让你哪个对象或好基友或闺蜜去菜市场 --> 挑菜 --> 回家 -->  摘菜  --> 洗菜 -->  切菜  -->  炒菜  -->  上桌        上桌之后,吃(两个人)    你去刷锅。此时整个操作,除了刷锅和吃是你自己完成,其它的只是说了一嘴,你去完成其它所有的操作,这个过程他买什么菜、去哪个菜市场、怎么切不用管,反正最后能吃上就行。这就是面向对象,一些功能交给另外的对象完成。


1.2 面向对象三大特性

封装: 把相关信息存储在对象中的能力。

继承:继承是面向对象语言中最显著的一个特性。从已有类中派生出新的类,新的类能吸收已有类的属性和方法,并能够拓展新的能力。

多态:多种形态,可以通过不同的接口去实现。


1.3 类和对象

类:具有相同的特性和行为的集合。如:人类的身高、姓名、年龄等属性,行为如吃饭、睡觉、学习等行为。人类具有这些行为特征,但是又不能具体说这些行为特征的详细信息。所以,类是抽象的。

对象:从类中,拿出来的具体的个体,如:张三、身高180、23岁等属性,爱吃煎饼果子、睡觉爱打人、喜欢学箜篌等行为。这些描述就比较具体了。所以说,对象是具体的。


在传统的JS中(一般指ES3.1),不存在类的概念,但是可以通过构造函数模拟类。所以我们称其为基于对象的类编程语言。


1.4 体会面向过程和面向对象

假设描述一个人:这个人的名字叫张三、年龄23、性别男、爱吃 鱼香肉丝

面向过程:
面向对象

1.5 JS中对象的分类

内置对象:Array    String    Math   RegExp   Date

宿主对象:提供js运行环境的对象,目前指的是浏览器对象

自定义对象:大括号包裹的名值对 key-value



二、创建对象

2.1 原始方式

假设我们将猫科类的动物看作是一个对象,有猫科动物的品种、动龄,生活习性:

猫科类

基于这个原型对象去创建具体的个体,这个原型可以看作模拟类,基于这个模拟类创建对象如下:

基于模型创建对象


这种利用原型的方式创建对象有两个问题:
1. 上面三个独立的个体,程序不能识别出具体的个体(实例的对象)与原型(模拟类)之间的关系;
2. 书写的代码太冗余,每次基于原型去创建一个新的实例个体时,都要重复的去书写原型中那些属性和方法。


2.2  利用工厂函数进行改进

工厂函数创建对象

利用工厂函数,解决了代码冗余的问题。但是还是不能看出对象和原型之间的关系。
利用关键字obj instanceof Fn 或者利用 consstructor 查看构造函数


2.3 利用构造函数再次优化

构造函数和普通函数最明显的区别:构造函数首字母大写。利用使用this关键字,this指向实例化对象。

构造函数在实例化对象时,需要用到new关键字,语法  new 构造函数()

构造函数创建对象


构造函数的方式,解决了代码冗余的问题,也能确认出实例和原型之间的关系。
但是,也存在一定需要优化的问题,见原型优化。

如果构造函数中,仅使用return,那么它还是作为一个普通函数存在的。

当然,如果有this和return都共存的情况下,不同的数据类型,函数最终的处理结果不同。如果return返回的是一个基本数据类型的数据,则忽略。如果返回的是一个引用数据类型的数据,那么函数无论怎么调用,返回的都是这个引用数据类型的数据。


2.4 原型优化

假设有如下构造函数:

构造函数

上面每创建一个实例对象,都会重复创建des、sayHi、sayHello,它们所实现或获取的值都是一样的。这样重复创建会占用过多的内存,为了优化,我们开辟一个独立空间,作为其调用的地址。这样可以节约内存,利用的就是prototype这个原型。

原型优化


练习:请尝试着使用面向对象编程的方式,完成  小球在页面中随机滚动的案例

JS中面向对象介绍的评论 (共 条)

分享到微博请遵守国家法律