javascript高级程序设计学习(三)-----定义类

来源:互联网 发布:淘宝网连衣裙2016长袖 编辑:程序博客网 时间:2024/05/17 02:45

面向对象术语

对象

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高级程序设计>>