面向对象的程序设计
面向对象的语言有一个标志,那就是他们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。
1、理解对象
真实生活中的对象、属性和方法
在真实生活中,汽车是一个对象。
汽车有诸如车重和颜色等属性,也有诸如启动和停止的方法:
所有汽车都拥有同样的属性,但属性值因车而异。
所有汽车都拥有相同的方法,但是方法会在不同时间被执行。
1.1、JavaScript 对象
这段代码把一个单一值(porsche)赋给名为 car 的变量:
var car = "porsche";
对象也是变量。但是对象包含很多值。
这段代码把多个值(porsche, 911, white)赋给名为 car 的变量:
var car = {type:"porsche", model:"911", color:"white"};
值以名称:值对的方式来书写(名称和值由冒号分隔)。
JavaScript 对象是被命名值的容器。
1.2、对象属性
(JavaScript 对象中的)名称:值对被称为属性。
var person = {firstName:"Bill", lastName:"Gates", age:62, eyeColor:"blue"};
1.3、对象方法
对象也可以有方法。方法是在对象上执行的动作。方法以函数定义被存储在属性中。方法是作为属性来存储的函数。
实例
var person = {
firstName: "Bill",
lastName : "Gates",
id : 678,
fullName : function() {
return this.firstName + " " + this.lastName;
}
};
1.4、this 关键词
在函数定义中,this 引用该函数的“拥有者”。在上面的例子中,this 指的是“拥有” fistName 函数的 person 对象。换言之,this.firstName 的意思是 this 对象的 firstName 属性。
1.5、对象定义
我们定义(创建)了一个 JavaScript 对象:
实例
var person = {firstName:"Bill", lastName:"Gates", age:62, eyeColor:"blue"};
空格和折行都是允许的。对象定义可横跨多行:
实例
var person = {
firstName:"Bill",
lastName:"Gates",
age:50,
eyeColor:"blue"
};
1.6、访问对象属性
能够以两种方式访问属性:
objectName.propertyName
或者
objectName["propertyName"]
例子 1
person.lastName;
例子 2
person["lastName"];
访问对象方法,可以能够通过如下语法访问对象方法:
objectName.methodName()
实例
name = person.fullName();
如果不使用 () 访问 fullName 方法,则将返回函数定义:
实例
name = person.fullName;
方法实际上是以属性值的形式存储的函数定义,请不要把字符串、数值和布尔值声明为对象!
如果通过关键词 “new” 来声明 JavaScript 变量,则该变量会被创建为对象:
var x = new String(); // 把 x 声明为 String 对象
var y = new Number(); // 把 y 声明为 Number 对象
var z = new Boolean(); // 把 z 声明为 Boolean 对象
要避免字符串、数值或逻辑对象。他们会增加代码的复杂性并降低执行速度。
2、创建对象
2.1、工厂模式
用函数来封装以特定接口创建对象的细节。
function createPerson (name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayNmae = function (){
alert (this.name);
};
return o;
}
var person1 = createPerson ("Fay",21,"student");
构造函数需要经历的四个步骤:
1、创建一个新对象
2、将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
3、执行构造函数中的代码(为这个新对象添加属性)
4、返回新对象
2.2、原始模型
我们创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有势力共享的属性和方法
3、继承
许多面向对象的两种继承方式:接口继承和实现继承。接口继承制继承方法签名,而实现继承则继承实际的方法。
JavaScript主要通过原型链实现继承。原型链的构建是通过将一个类型的实例赋值给另一个构造函数的原型实现的。这样,子类型就能够访问超类型的所有属性和方法,这一点与基于类的继承很相似。原型链的问题是对象实例共享所有继承的属性和方法,因此不适宜单独使用。解决这个问题的技术是借用构造函数,即在子类型构造函数的内部调用超类型构造函数,这样就可以做到每个实例都具有自己的属性,同时还能保证只使用构造函数模型来定义类型,使用最多的继承模式是组合继承这种模式。