javascript对象继承的几种方法

前面一篇文章有降到javascript对象的创建,http://zzx19452008-163-com.iteye.com/admin/blogs/1157889

 

这里继续讲javascript中对象的继承的实现。javascript中对象的继承有5种

一:对象冒充

 

 所谓对象冒充,就是新的类冒充旧的类(旧的类必须采用构造函数方式),从而达到继承目的.

        eg.1

            function people(name,sex,age){    //使用构造函数方式

                this.name=name;

                this.sex=sex;

                this.age=age;

                this.say=function(){

                    alert("My name is "+this.name);

                };

                this.doing=function(){

                    alert("I am speaking");

                };

            }

            var Marry=new people("Marry","Woman","23");

            Marry.say();

            Marry.doing();

 

            function white_people(name,sex,age){

                this.inherit=people; //也可以用new代替inherit

                this.inherit(name,sex,age);

                delete this.inherit;

 

                this.area=function(){

                    alert("I am in Europe");

                }

            }

            var Tom=new white_people("Tom","man","21");

            Tom.say();

            Tom.area();

            alert(Tom.age);

        上面的例子中,people是用来做white_people的基类,记住这个格式是用来对象冒充达到继承目的的

                this.inherit=people;            //冒充

                this.inherit(name,sex,age);        //继承

                delete this.inherit;            //删除继承

        所有新属性和新方法都必须再删除了继承后定义,这样是为了避免覆盖父类的相关属性和方法.

        另外,对象冒充支持多继承.

 

  eg.2

            function worker(pay,work){

                this.pay=pay;

                this.work=work;

            }

            function city_worker(name,sex,age,pay,work){

                this.inherit=people;

                this.inherit(name,sex,age);

                delete this.inherit;

 

                this.inherit=worker;

                this.inherit(pay,work);

                delete this.inherit;

            }

 

            var Jerry=new city_worker("Jerry","man","21","$1000","coder");

            Jerry.say();

            alert(Jerry.work);

        对象冒充有一个不足的地方:多继承机制实现时,如果基类存在相同的属性或者方法,将从后面的类继承.

二:call方式

 

只是封装的对象冒充的一个函数.这样,我们不再需要写"经典"的三句话,而是用下面这句话代替:

            基类.call(对象,参数列表)

        eg.1

            function farmer(name,sex,age,pay,work){

                people.call(this,name,sex,age);

                worker.call(this,pay,work);

            }

 

            var Nicholas=new farmer("Nicholas","man","27","$3000","irrigator");

            Nicholas.say();

            alert(Nicholas.pay);

        同样,call()存在同名属性和方法的小问题.

 

 

三:apply方式

 

 和call()一样.apply()也是对象冒充的一个封装函数.其格式为:

            基类.apply(对象,参数数组);

        eg.1

            function white_collar(name,sex,age,pay,work){

                people.apply(this,new Array(name,sex,age));

                worker.apply(this,[pay,work]);

            }

 

            var Jiessie=new white_collar("Jiessie","woman","26","$2500","editor");

            Jiessie.say();

            alert(Jiessie.work);

        同样,apply()存在同名属性和方法的小问题.

 

 

四:原型链

 

 上面三种方式都是采用构造函数方式的继承,对应地,也具有原型函数方式的继承:原型链.

        eg.1

            function blue_collar(){

            }

            blue_collar.prototype.name="Jean";

            blue_collar.prototype.age="33";

            blue_collar.prototype.say=function(){

                alert("my name is "+ this.name);

            };

 

            function city_blue_collar(){

            }

            city_blue_collar.prototype=new blue_collar();

 

            var jj=new city_blue_collar;

            jj.say();

        原型链也具有了原型链的缺点:不能传递参数.另外,原型链不支持多继承。

五:混合方式

 

  使用构造函数方式来写类的属性,对属性的继承采用call()或者apply()

        使用原型方式来写的方法,对方法的继承采用原型链

        eg.1

            function beauty(name,age){

                this.name=name;

                this.age=age;

            }

            beauty.prototype.say=function(){

                alert("小女叫"+this.name);

            };

 

            function china_beauty(name,age,area){

                beauty.call(this,name,age);

                this.area=area;

            }

            china_beauty.prototype=new beauty();

            china_beauty.prototype.from=function(){

                alert("我来自"+this.area);

            };

 

            var diaochan=new china_beauty("貂禅","16","临洮");

            diaochan.say();

            diaochan.from();

            alert(diaochan.age);


原文网址:http://www.the6cn.com/html/20080526/2008052614623.htm

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值