JavaScript继承

JavaScrip继承

JavaScrip是门面向对象的语言,也有继承的概念。继承有两点有用的服务。1.它是代码重用的一种形式;2.引入类型系统规范。它是门基于原型的语言,意味它的对象可以直接从其他对象继承。它有个伪类的说法。


接下来想写Cat继承Mammal的例子
类图

构造器形式

当一个函数对象被创建的时候,Function构造器产生的函数对象会运行类似于这样子的代码。

 this.prototype={constructor:this};

新函数对象被赋予一个prototype属性,属性constructor的属性值为this,this是新函数的对象。prototype对象是存放继承特征的地方。每个函数都会得一个prototype对象。

//定义父类及属性
var Mammal=function(name){
    this.name=name;
};
//构造器对象定义方法
Mammal.prototype.get_name=function(){
    return this.name;
};
Mammal.prototype.says=function(){
    return this.saying||'';
};

//定义子类及属性
var Cat=function(name){
    this.name=name;
    this.saying='meow';
};
//通过构造器继承父类Mammal,构造函数Mammal()
Cat.prototype=new Mammal();
//子类方法
Cat.prototype.purr=function(n){
    var i,s='';
    for(i=0;i<n;i+=1){
        if(s){
            s+='-';
        }
        s+='r';
    }
    return s;
};

Cat.prototype.get_name=function(){
    return this.says()+' '+this.name+' '+ this.says();
};

初始化运行
运行结果

缺点:

  • 没有私有环境,所有属性都是公开的。
  • 无法调用父类方法。

使用构造函数的时候,如果忘了new,那么对象的this会绑定到全局对象上,污染全局环境变量

//Cat的this绑定到全局对象上,正常运行,污染全局变量。
Cat.prototype=Mammal();

为了降低避免污染全局变量,所有的构造器函数都约定命名在首字母大写的形式。

原型形式

在纯粹的原型模式中,会摒弃类,专注于对象。一个新对象可以继承一个旧对象的属性。当你创建一个新对象时,可以选择某个对象作为它的原型。Object对象的create方法,可以创建一个使用原对象作为其原型的新对象。

//定义对象myMammal
var myMammal={
    name:'Herb the Mammal',
    get_name:function(){
        return this.name;
    },
    says:function(){
        return this.saying||'';
    }
};

//定义新对象myCat继承旧对象myMammal,借助Object.create()
var myCat=Object.create(myMammal);
//定义属性
myCat.name='Henrietta';
myCat.saying='meow';
//定义方法
myCat.purr=function(n){
    var i,s='';
    for(i=0;i<n;i+=1){
        if(s){
            s+='-';
        }
        s+='r';
    }
    return s;
};

myCat.get_name=function(){
    return this.says()+' '+this.name+' '+ this.says();
};


  • 继承效果图
    继承图

函数化形式

//定义函数(父类)mammal
var mammal=function(spec){
    //定私有义对象that
    var that={};

    //定义对象下的方法
    that.get_name=function(){
        return spec.name;
    };
    that.says=function(){
        return spec.saying||'';
    };
    //返回定义对象给函数
    return that;
};
//实例化调用,以{}对象的形式传入参数
var myMammal=mammal({name:'Herb'});

var cat=function(spec){
    spec.saying=spec.saying||'meow';
    var that=mammal(spec);
    that.purr=function(n){
        var i,s='';
        for(i=0;i<n;i+=1){
            if(s){
                s+='-';
            }
            s+='r';
        }
    return s;
    };
    that.get_name=function(){
        return that.says()+' '+spec.name+' '+that.says();
    };
    return that;
};

//调用函数,以{}对象的形式传入参数,实例化子类cat
var myCat=cat({name:'Henrietta'});

初始化运行
函数化形式

优点:

  • 灵活大
  • 更好的封装和隐藏信息
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值