面向对象概述
1.1面向对象概述
1)为什么要面向对象编程
结论:对于面向过程思想,我们扮演的是执行者,凡事都要靠自己完成。
对于面向对象思想,我们扮演的是指挥官,只要找到相应的对象,让它们帮我们做具体的事情即可。
2)面向对象的三大特征
封装:指的是隐藏内部的实现细节,只对外开放操作接口。
接口:就是对象的方法,无论对象的内部多么复杂,用户只需知道这些接口怎么使用即可。
举例:电脑是非常高精密的电子设备,其实现原理也非常复杂,而用户在使用时并不需要知道这些细节,只要操作键盘和鼠标就可以使用。
说明:一个类如果封装得好,那么它将拥有很高的“内聚性”,什么是内聚性?高内聚代表它只完成自己该做的事,不涉足和自己无关的事,作为代码构件,很容易被重用,能有和其他构件很容易地组合,以发挥更大的能力,高内聚常常意味着代码质量。
继承:是指一个对象继承另一个对象的成员,从而在不改变另一个对象的前提下进行扩展。
举例:动物与猫和狗的关系,人类的繁衍等。
举例:String对象就是对所有字符串的抽象,所有字符串都具有toUpperCase()方法,用来将字符串转换为大写,这个方法其实就是继承自String对象。
优势:
多态:指的是同一个操作作用于不同的对象,会产生不同的执行结果。
理解:实际上JavaScript被设计成一种弱类型语言(即一个变量可以存储任意类型的数据),就是多态性的体现。
提示:在面向对象中,多态性的实现往往离不开继承,这是因为当多个对象继承了同一个对象后,就获得了相同的方法,然后根据每个对象的不同来改变同名方法的执行结果。
提示:虽然面向对象有封装、继承、多态这些设计思想,但并不表示只要满足这些特征就可以设计出优秀的程序,开发人员还需要考虑如何合理的运用这些特征。
例1:在封装时,如何给外部调用者提供完整且最小的接口,使外部调用者可以顺利得到想要的功能,不需要研究其内部的细节。
例2:在进行继承和多态设计时,对于继承了同一个对象的多种不同的子对象,如何设计一套相同的方法进行操作。
1.2定义对象
1)使用new Object( )创建对象
JavaScript使用new运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。JavaScript中几乎所有的对象都是 Object 类型的实例,它们都会从 Object.prototype 继承属性和方法。Object构造函数创建一个对象包装器。Object构造函数,会根据给定的参数创建对象,具体有以下情况:
2)使用字面量创建对象
JavaScript中也支持使用字面量的方式进行创建对象,可以使用一对大括号的方式表示对象字面量。
也可以在大括号内直接进行编码。
2.3对象成员访问与遍历
对象创建好后,就可以访问对象的属性和方法了,单个成员可以通过点运算符或者中括号运算符进行访问,如果想要遍历所有的成员则可以通过for…in语句完成。
1)对象成员的访问
访问对象属性可以通过两种方式:
对象名.属性
对象名[‘属性’]
提示:如果访问对象中不存在的属性,则返回undefined。
var stu = {}; //空对象
console.log(stu.name); //undefined
访问对象方法同样也可以通过两种方式:
对象名.方法名()
对象名[‘方法名’]()
提示:如果访问对象中不存在的方法,则浏览器会提示该函数不是函数。
var stu = {}; //空对象
stu.goodBye(); //Uncaught TypeError: stu.goodBye is not a function
2)对象成员的遍历
使用for…in语法可以遍历指定对象中的所有属性和方法。基本语法格式如下:
for(var key in obj)
提示:需要注意的是循环内部要访问属性的时候不能使用点语法访问,因为for…in循环的key是字符串格式,可通过方括号实现访问。
如果对象中有方法,则需要注意输出方法时如果不加圆括号,则输出方法代码。如果需要调用函数,则需要加上一对圆括号。
如果需要在遍历到对象方法的时候,去执行方法代码,则需要首先判断遍历结果的类型,如果是方法则通过加圆括号的方式调用方法。
利用构造函数创建对象
2.1构造函数的概念
1)为什么使用构造函数
什么是构造函数:是JavaScript创建对象的另外一种方式。
与字面量方式创建对象对比:构造函数可以创建出一些具有相同特征的对象。
举例:通过水果构造函数创建苹果、香蕉、橘子对象。其特点在于这些对象都基于同一个模板创建,同时每个对象又有自己的特征。
字面量的方式创建对象的特点
优势:简单灵活。
劣势:当需要创建一组具有相同特征的对象时,无法通过代码指定这些对象应该具有哪些相同的成员。
当需要创建多个对象时可以利用构造函数来创建对象。
2)JavaScript内置的构造函数
常见的内置构造函数:Object、String、Number等构造函数。
构造函数如何创建对象:new 构造函数名()。
什么是实例化与实例:人们习惯将使用new关键字创建对象的过程称为实例化,实例化后得到的对象称为构造函数的实例。
“对象”是单个实物的抽象。通常需要一个模板,表示某一类实物的共同特征,然后“对象”根据这个模板生成。JavaScript语言中使用构造函数(constructor)作为对象的模板。所谓构造函数,就是提供一个生成对象的模板,并描述对象的基本结构的函数。一个构造函数,可以生成多个对象,每个对象都有相同的结构。
// 通过构造函数创建对象
var obj = new Object(); // 创建Object对象
var str = new String('123'); // 创建String对象
// 查看对象是由哪个构造函数创建的
console.log(obj.constructor); // 输出结果:function Object() { [native code] }
console.log(str.constructor); // 输出结果:function String() { [native code] }
console.log({}.constructor); // 输出结果:function Object() { [native code] }
•“对象.constructor”属性指向了该对象的构造函数。
•通过console.log()输出时,[native code]表示该函数的代码是内置的。
2.2定义构造函数
1)使用构造函数
构造函数的三个特点: