java script 面向对象-javascript怎么定义类和对象

java script 面向对象--javascript如何定义类和对象

javascript如何定义类和对象

1、原始方式

 

var oCar = new Object; 
oCar.color = "blue"; 
oCar.doors = 4;
oCar.mpg = 25;
oCar.showColor = function() { 
   alert(this.color); 
};

 

 

2、工厂方法

 

function createCar(sColor,iDoors,iMpg) {
  var oTempCar = new Object;
  oTempCar.color = sColor;
  oTempCar.doors = iDoors;
  oTempCar.mpg = iMpg;
  oTempCar.showColor = function() {
    alert(this.color);
  };
  return oTempCar;
}

var oCar1 = createCar("red",4,23);
var oCar2 = createCar("blue",3,25);

oCar1.showColor();		//输出 "red"
oCar2.showColor();		//输出 "blue"

 缺点是:1、每次都创建一个object类型的对象,不能使用instanceof

               2、每次创建对象的时候,方法也会被创建一次,方法不能被同一个类的对象共享。

 

在工厂方法外构建方法

 

function showColor() {
  alert(this.color);
}

function createCar(sColor,iDoors,iMpg) {
  var oTempCar = new Object;
  oTempCar.color = sColor;
  oTempCar.doors = iDoors;
  oTempCar.mpg = iMpg;
  oTempCar.showColor = showColor;
  return oTempCar;
}

var oCar1 = createCar("red",4,23);
var oCar2 = createCar("blue",3,25);

oCar1.showColor();		//输出 "red"
oCar2.showColor();		//输出 "blue"

 但是从语义上来讲这个方法showColor不太像对象的属性。

 

3、构造函数方式

 

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);

优点:跟工厂方式不同的是,每次创建同一个类的对象时,不是创建一个object的对象,使用this。同时,可以使用instance of。

缺点:和工厂方式一样,不能再构造函数内定义共享的函数。

 

4、原型对象

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"

 

使用原型方式的缺点是同一类的所有对象将共享同一原型对象,原型对象的所有属性都将被共享,且属性定义只能在原型定义之后。

优点:1、同一类创建的对象将共享类的方法。

缺点:1、从这个类new出来的对象共享类的所有属性。如加粗的部分,数组引用被共享,在ocar1中改变array,ocar2也会相应改变。

           2、构造函数不能有参数

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"

 优点:1、解决了上述的不能同时拥有专属的属性和方法和共享属性和方法的问题,通过构造函数来实现instance的专属属性和方法,通过原型实现属性和方法的共享。

            2、可以使用instanceof

 缺点:1、封装还不够好 没有用

动态原型方法

function Car(sColor,iDoors,iMpg) {
  this.color = sColor;
  this.doors = iDoors;
  this.mpg = iMpg;
  this.drivers = new Array("Mike","John");
  
  if (typeof Car._initialized == "undefined") {
    Car.prototype.showColor = function() {
      alert(this.color);
    };
	
    Car._initialized = true;
  }
}

 完美解决上述问题