js的三种继承方法

js继承:子类不会影响父类,子类可以继承父类的一些功能(代码复用)
三种方法
1、拷贝继承:通用型的,有new或无new的时候都可以
2、类式继承:new构造函数
3、原型继承:无new的对象

1、拷贝继承:属性与方法一般分开来继承
      属性继承:调用父类的构造函数 call
      方法继承:用  for  in  来继承
例子:

< script>

        function  Person( nameage) {
            this.name  name;
            this.age  age;
        }
        Person.prototype. showName  = function () {
            alert( this.name);
        }

        var  p1  = new  Person( '张三'12);

        alert( p1.name);

        function  Star( nameagejob) {
            Person. call( this, name, age);
            this.job  job;
        }


        //这样写时,子类改变会影响父类,如在子类上添加方法也会添加到父类上
//        Star.prototype = Person.prototype;

        extend( Star.prototype,  Person.prototype);

        Star.prototype. showJob  = function () {
            alert( this.job);
        }

        var  s1  = new  Star( '小明'32'演员');
        s1. showName();
        s1. showJob();

//        p1.showJob();


        function  extend( obj1 obj2) {
            for( var attr  in  obj2){
                obj1[attr]  obj2[attr];
            }
        }

    </ script>

2、类式继承:js中没有类的结构,把js中的构造函数看作类
     属性与方法一样分开来继承
例子:
< script>

    function  Aaa() {    //父类
        this.name  '张三';
        this.arrNum  [ 1, 2, 3];
    }
    Aaa.prototype. showName  = function () {
        alert( this.name);
    }

    function  Bbb() {  //子类
        Aaa. call( this);
    }

    //加上这四句话后,子类的改变不会影响父类;此时只继承类方法;属性需要通过上面的call来继承
    var  Temp  = function () {};
    Temp.prototype  Aaa.prototype;
    Bbb.prototype  = new  Temp();
    Bbb.prototype. constructor  Bbb//修正构造器指向问题

    var  b1  = new  Bbb();
    b1. showName();
    alert( b1. constructor);
    b1.arrNum. push( 4);

    /**
     * 如果子类不加上Aaa.call(this)
     * 而且不加下面的四句话,更新b1的属性时,b2的也受影响了
     * var Temp = function () {};
     * Temp.prototype = Aaa.prototype;
     * Bbb.prototype = new Temp();
     * Bbb.prototype.constructor = Bbb;  //修正指向问题
     * @type {Bbb}
     */
    var  b2  = new  Bbb();
    alert( b2.arrNum);

</ script>

3、原型继承:
例子:
< script>

    var  {
        name '张三'
    }
   
    var  cloneObj( a);

    b.name  'lisi';

    alert( b.name);
    alert( a.name);

    function  cloneObj( obj) {

        var  Temp  = function () {};

        Temp.prototype  obj;

        return new  Temp();
    }

</ script>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值