面向对象术语
对象
ECMA-262 把对象(object)定义为“属性的无序集合,每个属性存放一个原始值、对象或函数”。严格来说,这意味着对象是无特定顺序的值的数组。
尽管 ECMAScript 如此定义对象,但它更通用的定义是基于代码的名词(人、地点或事物)的表示。
类
每个对象都由类定义,可以把类看做对象的配方。类不仅要定义对象的接口(interface)(开发者访问的属性和方法),还要定义对象的内部工作(使属性和方法发挥作用的代码)。编译器和解释程序都根据类的说明构建对象。
javascript定义类或对象的方法:
(1) 工厂方式.
var oCar=new Object();
oCar.color="blue";
oCar.doors=4;
oCar.showColor=function(){
alert(this.color);
}
这是最传统的方法。缺点很明显,不能创建多个Car实例。使用工厂方式解决这个问题:
function createCar() {
var oTempCar = new Object;
oTempCar.color = "blue";
oTempCar.doors = 4;
oTempCar.mpg = 25;
oTempCar.showColor = function() {
alert(this.color);
};
return oTempCar;
}
var oCar1 = createCar();
var oCar2 = createCar();(2)构造函数方式:
function Car(sColor,iDoors,iMpg) {
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.showColor = function() {
alert(this.color);
};
}
var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);
工厂函数,构造函数会重复生成函数,为每个对象都创建独立的函数版本。这正是下面要讲的原型方式的优势所在。
(3)原型方式
function Car() {
}
Car.prototype.color = "blue";
Car.prototype.doors = 4;
Car.prototype.mpg = 25;
Car.prototype.drivers = new Array("Mike","John");
Car.prototype.showColor = function() {
alert(this.color);
};
var oCar1 = new Car();
var oCar2 = new Car();
oCar1.drivers.push("Bill");
alert(oCar1.drivers); //输出 "Mike,John,Bill"
alert(oCar2.drivers); //输出 "Mike,John,Bill"
原型方法最大的缺点就是无法传入参数,和共享变量,如上例 设置oCar2.color="red", oCar.color将会被改变。
(4)混合构造/原型方式
function Car(sColor,iDoors,iMpg) {
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.drivers = new Array("Mike","John");
}
Car.prototype.showColor = function() {
alert(this.color);
};
var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);
oCar1.drivers.push("Bill");
alert(oCar1.drivers); //输出 "Mike,John,Bill"
alert(oCar2.drivers); //输出 "Mike,John"
这是使用得最多的一种方式。只是视觉封装不够完美。可以考虑使用动态原型方式解决。
参考图书:<<javascript高级程序设计>>
本文深入探讨了面向对象编程的核心概念,包括对象、类及其定义方式,详细解释了工厂方式、构造函数方式、原型方式和混合构造/原型方式,并提供了实例代码进行演示。

被折叠的 条评论
为什么被折叠?



