js继承 原型链+构造函数+组合继承法

26 篇文章 0 订阅
21 篇文章 0 订阅
 
    //继承方法之原型链
    function A() {    //创建一个原型对象A,有属性和方法
        this.judge=true;
    }
    A.prototype.value=function () {
        return this.judge
    };

    function B() {   //创建B,属性和A不相同
        this.judge=false;
    }
    B.prototype = new A();    // B继承A
    B.prototype.value=function () {
        return this.judge
    };

    var p=new B;  //创建一个实例p,
    console.log(p.value())  //false   因为p的原型是B,B的属性值为false,如果B里没有定义属性,则会继续向B 的原型A上去找,那就返回true.
总结:通过原型链实现继承时,不能使用对象字面量创建原型方法,那样会重写原型链。此外,原型上的属性会被多个实例共享,而且不能传参数。


 //继承方法之借用构造函数
    function P1() {
        this.colors=["red","blue"]
    }
    function P2() {
         P1.call(this)  //通过call方法继承P1
     }
     var s=new P2();
    s.colors.push("pink"); //向实例s的colors里添加一个pink颜色
    console.log(s.colors);  //打印出来red blue pink

    var b=new P2();  //创建一个b实例
    console.log(b.colors)   //打印b实例的颜色属性,只有red和blue,不会受到第一个实例的影响

总结:优点:实例不会互相干扰,在继承时还可以传递参数;弊端:函数方法都是在构造函数中定义的,因此函数的复用比较困难,很少单独使用。

   function A(name) {   //创建原型A
        this.name=name;   //两个属性
        this.colors=["red","blue"]
    }
    A.prototype.fuck=function () {  //一个方法
        alert(this.name)
    };
    
    function B(name,age) {
        A.call(this,name);  //继承A的属性
        this.age=age;     //传参并有自己的属性
    }
    B.prototype = new A();   //继承方法
    B.prototype.constructor=B;  //将指针改为B自身
    B.prototype.say=function () {
        alert(this.age)
    };

    var person1=new B("Bob",20);   //实例1
    person1.colors.push("yellow");
    console.log(person1.colors);  //["red","blue","yellow"]
    person1.fuck();   //Bob
    person1.say();    //20

    var person2=new B("john",18);  //实例2
    console.log(person2.colors);  //["red","blue"]
    person2.fuck();   //john
    person2.say();    //18
总结:组合继承法融合了前两种方法的优点,使用率最高,最稳当。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值