javascript学习笔记 (二)设计模式

http://www.w3school.com.cn/js/pro_js_object_defining.asp

一、面向对象

1、工厂模式

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);
var o = new Object();
Car.caller(o,"red",4,23);//和上面的效果一样

alert(oCar1 instanceof Car); //true 


缺点:每个方法都要在实例上面重新创建一遍

3、原型方式

function Car() {
}

Car.prototype.color = "blue";
Car.prototype.doors = 4;
Car.prototype.mpg = 25;
Car.prototype.showColor = function() {
  alert(this.color);
};

var oCar1 = new Car();
var oCar2 = new Car();

alert(Car.prototype.isPrototypeOf(oCar1));//true
oCar1.color="black";
alert(oCar1.color);//black
alert(oCar1.hasOwnPrototype(color);//true
delete(oCar1.color);
alert(oCar1.color);//blue ;delete可以完全删除实例属性,从而让我们重新访问原型中的属性
alert(oCar1.hasOwnPrototype(color));//false;hasOwnPrototype能够检测一个属性是否存在于对象实例中,存在时返回true
alert("color" in oCar1);//true;两种情况下使用in操作符:1、for-in 2、检测属性是否在对象原型或者实例中


原型方法也可以写成:
function Car() {
}

Car.prototype={
    color:"blue",
    doors:4,
    mpg:25,
    showColor:function(){
        alert(this.color);
    }
}

var oCar1 = new Car();
var oCar2 = new Car();
缺点:1、默认情况下都取得相同的默认值;2、由于其共享的本性导致其属性被多个实例共享,如果原型中有引用类型的变量,在一个实例中改变它,其他实例也会改变。


4、结合构造函数模式和原型模式

function Car(sColor,iDoors,iMpg) {
  this.color = sColor;
  this.doors = iDoors;
  this.mpg = iMpg;
}
Car.prototype = {
   constructor:"Car",
   showColor : function() {
       alert(this.color);
   }
};
5、动态原型模式
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;
  }
}

二、javascript继承
http://www.w3school.com.cn/js/pro_js_inheritance_implementing.asp




你可能感兴趣的:(javascript学习笔记 (二)设计模式)