bob体育官方平台
bob体育app商酌javascript工厂方式 js面象对象的定义方法_js面向对象_脚本之家

复制代码 代码如下://60年代的汽车工厂 var ocar=new Object; ocar.color="black"; ocar.doors=2; ocar.pinpai="解放"; ocar.showPinpai=function() { alert;//需要一个生产线,生产一个汽车,再生产下个汽车还需要建立新的生产线 } //70年代的汽车工厂 function createcar() { var oTempCar=new Object; oTempCar.color="black"; oTempCar.doors=4; oTempCar.pinpai="桑塔纳"; oTempCar.showPinpai=function() { alert;//方便生产,一个生产线,可以生产多个汽车 } return oTempCar; } //80年代生产汽车 function createcar(sColor,iDoors,sPinpai) { var oTempCar=new Object; oTempCar.color=sColor; oTempCar.doors=iDoors; oTempCar.pinpai=sPinpai; oTempCar.showPinpai=function() { alert;//方便生产,一次成型生产 } return oTempCar; } //90年代生产汽车 function showPinpai; } function createcar(sColor,iDoors,sPinpai) { var oTempCar=new Object; oTempCar.color=sColor; oTempCar.doors=iDoors; oTempCar.pinpai=sPinpai; oTempCar.showPinpai=function() return oTempCar; } var oBmw=createcar; oBmw.showColor();//一次成型+组装生产

复制代码 代码如下:

var oCar1 = new Car("red", 4, 23);
var oCar2 = new Car("red", 4, 23);
oCar1.showColor();
oCar2.showColor();

下面用《javascript高级程序设计》中的例子来做说明,假如现在定义了一个car的对象,它是Object类的实例。像下面这样的:

复制代码 代码如下:

function Car() {

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

var car = new Car();
car.showColor();

七、类的定义--混合工厂方式实现

oCar1.drivers.push("Matt");
alert(oCar1.drivers);
alert(oCar2.drivers);六、类的定义--动态原型方式实现

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

复制代码 代码如下:

2、不符合面向对象的特征--封装。在这个例子中,oCar1和oCar2都有自己的showColor方法,并且他们的showColor都是自己的实现。但是事实是他们共享的是同一个函数。

五、类的实现--混合的构造函数/原型方式实现

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

return oTempCar;
}

这样遇到的问题是每个对象都需要重新定义一次他的字段和方法。很麻烦。

oCar1.showColor();
oCar2.showColor();

复制代码 代码如下:

var oCar1 = new Car();
oCar1.color = "Green";

对上面的例子进行一个包装,利用函数的返回值来做文章:

这种方式和混合的构造函数/原型方式相比,提供了一种友好的编程风格(在混合的构造函数/原型方式中,showColor方法的定义是在方法体外实现的,而不是在构造函数的方法体内完成的)。这种类的定义方式使用也很多。

复制代码 代码如下:

复制代码 代码如下:

这种实现方式是将每个类的实例中共享的属性或者方法妨到原型链中实现,而将不需要共享实现的属性和方法放在构造函数中实现。这中类的实现方式是使用最广泛的方式。

利用对象的prototype属性,把它看成是创建新对象所依赖的原型。用空构造函数来设置类名。然后所有的属性和方法都被直接赋予prototype属性。

var oCar2 = new Car();
oCar2.color = "Black";
alert(oCar1.color); //output Green
alert(oCar2.color); //output Black
alert(oCar1.color); //output Black

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

function Car() {
var oTempCar = new Object();
oTempCar.color = "red";
oTempCar.doors = 4;
oTempCar.mpg = 23;
oTempCar.showColor = function () {
alert(this.color);
};
return oTempCar;
}

2、在有多个实例时,对其中一个实例的属性的更改会影响到另外一个实例的属性。

复制代码 代码如下:

在Car类中,this指针代表了Car的一个实例,因此不需要返回值。虽然构造函数方式实现了类的定义,但是和工厂方式一样,他也是为每个实例创建一个单独的方法。虽然可以像工厂函数一样在函数之外再创建一个函数利用指针来解决这个问题,但是这么做的话,在语义上没有意义。

返回顶部