javaScript定义类或者对象

目录 (Table of Contents)

[TOCM]

工厂方式

通过创建能返回特定类型的对象的工厂函数,来创建类。
方法1:

function CreateCar(sColor, iDoors, iMpg) {
    var oTempCar = new Object;
    oTempCar.color = sColor;
    oTempCar.door = iDoor;
    oTempCar.mpg = iMpg;
    oTempCar.showColor = functiong() {
        alert(this.color)
    }
    return oTempCar;
}

var oCar1 = CreateCar("red", 4, 23);
var oCar2 = CreateCar("blue", 3, 25);
oCar1.showColor();  //outputs "red"
oCar2.showColor();  //outputs "blue"

上诉方式有个问题,就是在调用CreateCar创建对象时,会为每个对象都创建一个showColor()方法,意味着每个对象都有自己的showColor()版本,实际上每个对象都共享了一个,为了解决以上问题,有些开发者在工厂为定义方法,如下。
方法2:

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

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

var oCar1 = CreateCar("red", 4, 23);
var oCar2 = CreateCar("blue", 3, 25);
oCar1.showColor();  //outputs "red"
oCar2.showColor();  //outputs "blue"

从功能上讲,解决了重复创建函数对象的问题,但是该函数看起来不像对象的方法。

构造函数方式

方法:

function Car(sColor, iDoor, iMpg) {
    this.color = sColor;
    this.door = iDoor;
    this.mpg = iMpg;
    this.showColor = function() {
        alert(this.color);
    }
}

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

需要注意的是,类名按惯例首字母大写。
构造函数方式和工厂方式很相似,同样会重复生成函数,虽然可以在类外定义方法,但是任然没有解决问题。

原型方式

方法:

function Car() {
}

Car.prototype.color = "red";
Car.prototype.doors = 4;
Car.prototype.mpg = 23;
Car.prototype.drivers = new Array("Mike", "Sue");
Car.prototype.showColor = function () {
    alert(this.color);
}

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

oCar1.drivers.push("Matt");

alter(oCar1.drivers);   //outputs "Mike,Sue,Matt"
alter(oCar2.drivers);   //outputs "Mike,Sue,Matt"

这段代码中,通过给Car的prototype属性添加属性去定义Car对象的属性。在创建对象是,所有实例存放的都是指向showColor函数的指针。除了函数外,属性也是保存的指针
因为是保存指针的缘故,所以任意一个实例改变自己属性的值,就会引起其他实例属性值发生变化。而这个是不愿意被看到的。

混合的构造函数/原型方式(最常用)

方法:

function Car(sColor, iDoor, iMpg) {
    this.color = sColor;
    this.door = iDoor;
    this.mpg = iMpg;
    this.drivers = new Array("Mike", "Sue");
}

Car.prototype.showColor = function () {
    alert(this.color);
}

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

oCar1.drivers.push("Matt");

alter(oCar1.drivers); //outputs "Mike,Sue,Matt"
alter(oCar2.drivers); //outputs "Mike,Sue"

这种方法是ECMAScript采用的主要方式,它具有其他方式的特性,却没有他们的副作用。不过有些开发者仍认为这种方法不够完美。

动态原型方法(合理可用)

方法:

function Car(sColor, iDoor, iMpg) {
    this.color = sColor;
    this.door = iDoor;
    this.mpg = iMpg;
    this.drivers = new Array("Mike", "Sue");

    if(typeof Car._initialized == "undefined") {
        Car.prototype.showColor = function () {
            alert(this.color);
        };
        Car._initialized = true;
    }
}

通过判断Car._initialized,进行函数定义,保证该方法只会赋值一次。所以只有在第一次实例化的时候,才会创建函数showColor 。

混合工厂方式

方法:

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

var car = new Car();

这种方式的目的是创建假的构造函数,只返回另一种对象的新实例。
这种方式在内部管理方面与经典方式有着相同的问题。除非万不得已避免使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值