标签:
因为对象的属性和方法可以在对象创建后动态定义,可以编写下面的代码:
(魔芋:创建一个对象后,可以任意在很多位置给它添加属性和方法。)
var Car=newObject;Car.color ="blue";Car.doors =4;Car.mpg =25;Car.showColor = function(){ console.log(this.color);};Car.showColor();//blue Car.changeColor = function(e){console.log(e);}Car.changeColor("red");//red
要解决该问题,开发者创造了能创建并返回特定类型的对象的工厂函数(factory function)。
例如,函数 createCar() 可用于封装前面列出的创建 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();(魔芋:因为createCar 有返回值:返回我们在函数中创建的局部变量oTempCar。所以oCar1 为oTempCar ;)
我们还可以修改 createCar() 函数,给它传递各个属性的默认值,而不是简单地赋予属性默认值:
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"
给 createCar() 函数加上参数,即可为要创建的 car 对象的 color、doors 和 mpg 属性赋值。这使两个对象具有相同的属性,却有不同的属性值。
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"
所有这些问题都引发了开发者定义的构造函数的出现。
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);该方式利用了对象的 prototype 属性,可以把它看成创建新对象所依赖的原型。
这里,首先用空构造函数来设置类名。然后所有的属性和方法都被直接赋予 prototype 属性。我们重写了前面的例子,代码如下:
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(oCar1 instanceof Car);//输出 "true"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"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"
class Car { public String color = "blue"; public int doors = 4; public int mpg = 25; public Car(String color, int doors, int mpg) { this.color = color; this.doors = doors; this.mpg = mpg; } public void showColor() { System.out.println(color); }}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; }}
function Car() { var oTempCar = new Object; oTempCar.color = "blue"; oTempCar.doors = 4; oTempCar.mpg = 25; oTempCar.showColor = function() { alert(this.color); }; return oTempCar;}
与经典方式不同,这种方式使用 new 运算符,使它看起来像真正的构造函数:
var car = new Car();标签:
原文地址:http://www.cnblogs.com/moyuling/p/5218676.html