javascript 里的类实现

摘抄自《javascript高级程序设计》一书。
javascript 是面向对象的语言,自然也有面向对象的一些特性。
一:构造函数方式
第一步选择类名,即构造函数的名字。下面的例子在构造函数里不创造对象,而是使用this,使用new 运算符调用构造函数的时候在执行第一行代码前先创建一个对象,这个对象只能用this访问,然后可以直接赋予this属性,默认情况下是构造函数的返回值,不必return。
 例子:
None.gif function  Car(sColor,iDoors)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
this.color = sColor;
InBlock.gif    
this.doors = iDoors;
InBlock.gif    
this.showColor = function()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        alert(
this.color);
ExpandedSubBlockEnd.gif    }
;
ExpandedBlockEnd.gif}
None.gif
None.gif
var  oCar1  =   new  Car( " red " , 4 ); // output red
None.gif
var  oCar2  =   new  Car( " blue " , 3 ); // output blue
上面的例子会为每个对象都创建独立的函数版本。再看下面的原型方式
二:原型方式:
该方式利用对象的prototype属性,可把它看成创建新对象所依赖的原型。下面的例子使用空构造函数设置类名,然后所有的属性和方法都直接赋予prototype属性。在调用new Car()的时候原型的所有属性都被立即赋予要创建的对象。
例子:
None.gif function  Car()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedBlockEnd.gif}

None.gifCar.prototype.color 
=   " red " ;
None.gifCar.prototype.doors 
=   4 ;
None.gifCar.prototype.showColor 
=   function ()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif     alert(
this.color);
ExpandedBlockEnd.gif}
;None.gif
None.gif
var  oCar1  =   new  Car(); // output red
上面的例子在创建多个实例后,对象的属性值并没有变。再看下面的混合的构造函数/原型方式
三:混合的构造函数/原型方式:
联合使用构造函数和原型方式,就可以像其他程序设计语言杨创建对象。使用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性。
None.gif function  Car(sColor,iDoors)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
this.color = sColor;
InBlock.gif    
this.doors = iDoors;
ExpandedBlockEnd.gif}

None.gifCar.prototype.showColor 
=   function ()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif     alert(
this.color);
ExpandedBlockEnd.gif}
;
None.gif
None.gif
var  oCar1  =   new  Car( " red " , 4 );
None.gif
var  oCar2  =   new  Car( " blue " , 3 );
None.gif
None.gifoCar1.showColor();
// output red
None.gif
oCar2.showColor(); // output blue

四:动态原型方法:
动态原型方法的基本想法和混合的构造函数/原型方式相同,唯一的区别是赋予对象方法的位置,看下面的例子:
None.gif function  Car(sColor,iDoors)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
this.color = sColor;
InBlock.gif    
this.doors = iDoors;
InBlock.gif    
if(typeof Car.initialized == "undefined")//***
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{
InBlock.gif        Car.prototype.showColor 
= function()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif             alert(
this.color);
ExpandedSubBlockEnd.gif        }
;
InBlock.gif        Car.initialized 
= true;//***
ExpandedSubBlockEnd.gif
    }

ExpandedBlockEnd.gif}

上面的方法使用标志initialized来判断是否已给原型赋予任何方法,该方法只创建并赋值一次。

五:混合工厂方式
这种方式的目的是创建假构造函数,只返回一种对象的新实例:
None.gif function  Car()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
var tempCar = new Object;
InBlock.gif    tempCar.color 
= "red";
InBlock.gif    tempCar.doors 
= 4;
InBlock.gif    tempCar.showColor 
= function()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif       alert(
this.color);
ExpandedSubBlockEnd.gif    }
;
InBlock.gif    
return tempCar;
ExpandedBlockEnd.gif}

None.gif
var  oCar1  =   new  Car();
由于在Car()构造函数内部调用了new运算符,所以将忽略构造函数外的第2个new 运算符。不建议使用这种方式。

可以使用prototype属性为任何已有的类定义新的方法。

转载于:https://www.cnblogs.com/doll-net/archive/2007/05/18/751811.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值