1.工厂方式
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 = create("red",4,23);的时候都要从新创建新的showColor 函数,这样就以为这每个对象都有自己的函数。
解决的方法:
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; }
ps:这样写看起来好丑,不象一个对象了。
2.构造函数方法
function Car(sColor, iDoors, iMpg){ this.color = sColor; this.doors = iDoors; this.mpg = iMpg; this.showColor = function(){ alert(this.color); }; }
ps:默认是返回this,所以没必要写return this;
缺点:创建对象的时候也要不停的创建新的函数showColor
3.原型方式
function Car(){ } Car.prototype.color = "red"; Car.prototype.dorrs = 4; Car.prototype.mpg =23; Car.prototype.showColor = function(){ alert(this.color); }; Car.prototype.drivers = new Array("Mile","Sue"); var oCar1 = new Car(); var oCar2 = new Car(); oCar1.drivers.push("Matt"); alert(oCar1.drivers); //输出"Mike,Sue,Matt" alert(oCar2.drivers); //输出"Mike,Sue,Matt" } Car.prototype.color = "red"; Car.prototype.dorrs = 4; Car.prototype.mpg =23; Car.prototype.showColor = function(){ alert(this.color); }; Car.prototype.drivers = new Array("Mile","Sue"); var oCar1 = new Car(); var oCar2 = new Car(); oCar1.drivers.push("Matt"); alert(oCar1.drivers); //输出"Mike,Sue,Matt" alert(oCar2.drivers); //输出"Mike,Sue,Matt"
缺点:构造函数没参数;当属心为对象时候,所有被实力化的Car的对象属性都一样!
4.混合的构造函数/原型方式
用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)
function Car(sColor,iDoors,iMpg){ this.Color = sColor; this.doors = iDoors; this.mpg = iMpg; this.drivers = new Array("Mike","Sue"); } Car.prototype.showColor = function(){ alert(this.color); };
这样问题就都解决了,不过OOPer决定它不完美
5.动态原型方法
function Car(sColor,iDoors,iMpg){ this.color = sColor; this.doors = iDoors; this.mpg = iMpg; this.drivers = new Array("Mike","Sue"); if(typeof Car._initialized == "undefined"){ Car.prototype.showColor = function(){ alert(this.color); }; Car._initialized = true; } }
这样所有问题都解决并且向个正真的对象了
6。混合工厂方式
function Car(){ var oTempCar = new Object; oTempCar.color = "red"; oTempCar.doors = 4; oTempCar.mpg = 23; oTemp.showColor = function(){ alert(this.color) }; return oTempCar; }
这种方式通常是在不能应用前一种方式时的变通方式。创建假构造函数,返回另一种对象的新实例。
总结:目前用的最多的是混合的构造函数/原型方式,此外动态原型也很流行,不咬单独使用经典的构造函数或原型方式,这样的代码会有问题。
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 = create("red",4,23);的时候都要从新创建新的showColor 函数,这样就以为这每个对象都有自己的函数。
解决的方法:
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; }
ps:这样写看起来好丑,不象一个对象了。
2.构造函数方法
function Car(sColor, iDoors, iMpg){ this.color = sColor; this.doors = iDoors; this.mpg = iMpg; this.showColor = function(){ alert(this.color); }; }
ps:默认是返回this,所以没必要写return this;
缺点:创建对象的时候也要不停的创建新的函数showColor
3.原型方式
function Car(){ } Car.prototype.color = "red"; Car.prototype.dorrs = 4; Car.prototype.mpg =23; Car.prototype.showColor = function(){ alert(this.color); }; Car.prototype.drivers = new Array("Mile","Sue"); var oCar1 = new Car(); var oCar2 = new Car(); oCar1.drivers.push("Matt"); alert(oCar1.drivers); //输出"Mike,Sue,Matt" alert(oCar2.drivers); //输出"Mike,Sue,Matt" } Car.prototype.color = "red"; Car.prototype.dorrs = 4; Car.prototype.mpg =23; Car.prototype.showColor = function(){ alert(this.color); }; Car.prototype.drivers = new Array("Mile","Sue"); var oCar1 = new Car(); var oCar2 = new Car(); oCar1.drivers.push("Matt"); alert(oCar1.drivers); //输出"Mike,Sue,Matt" alert(oCar2.drivers); //输出"Mike,Sue,Matt"
缺点:构造函数没参数;当属心为对象时候,所有被实力化的Car的对象属性都一样!
4.混合的构造函数/原型方式
用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)
function Car(sColor,iDoors,iMpg){ this.Color = sColor; this.doors = iDoors; this.mpg = iMpg; this.drivers = new Array("Mike","Sue"); } Car.prototype.showColor = function(){ alert(this.color); };
这样问题就都解决了,不过OOPer决定它不完美
5.动态原型方法
function Car(sColor,iDoors,iMpg){ this.color = sColor; this.doors = iDoors; this.mpg = iMpg; this.drivers = new Array("Mike","Sue"); if(typeof Car._initialized == "undefined"){ Car.prototype.showColor = function(){ alert(this.color); }; Car._initialized = true; } }
这样所有问题都解决并且向个正真的对象了
6。混合工厂方式
function Car(){ var oTempCar = new Object; oTempCar.color = "red"; oTempCar.doors = 4; oTempCar.mpg = 23; oTemp.showColor = function(){ alert(this.color) }; return oTempCar; }
这种方式通常是在不能应用前一种方式时的变通方式。创建假构造函数,返回另一种对象的新实例。
总结:目前用的最多的是混合的构造函数/原型方式,此外动态原型也很流行,不咬单独使用经典的构造函数或原型方式,这样的代码会有问题。