js继承的六种方式

// 1.原型链
      function Person() {this.name = 'Tom'};
      Person.prototype.sayName = function () {alert('hello')};
      function Person1() {}
      Person1.prototype = new Person();
      var person = new Person1();
      //引用类型会在原型链上共享,不能给Person传参数
      //2.借用构造函数
      function Person(name) {this.name = name};
      Person.prototype.sayName = function () {alert('hello')};
      function Person1(name) {
        Person.call(this,'Tom')
      }
      var person = new Person1();
      //构造函数实现的继承,也可以传参,函数可复用性没有体现
      //3.组合继承
      function Person(name) {this.name = name};
      Person.prototype.sayName = function () {alert('hello')};
      function Person1(name) {
        Person.call(this,'Tom')//第二次调用
      }
      Person1.prototype = new Person();//第一次调用
      Person1.prototype.constructor = Person1;
      var person = new Person1();
      //原型上增加了无用属性,且每次new实例会调用两次Person
      //4.原型继承
      function object(o) {
        function F() {};
        F.prototype = o;
        return new F();
      }
      var obj = {
        name: 'Tom',
        arr: [1,2,3]
      }
      //或者使用ES5 Object.create(obj)原理一样
      // var test = Object.create(obj) 
      var test = object(obj);
      //继承了obj对象,函数复用性低,缺点和原型链继承一样,引用类型的属性值会被实例共享
      //5.寄生式继承
      function object(o) {
        function F() {};
        F.prototype = o;//{}
        return new F();
      }
      var obj = {
        name: 'Tom',
        arr: [1,2,3],
      }
      function sayName(o) {
        var clone = object(o);
        clone.sayName = function() {alert('hello')};
        return clone;
      }
      //或者使用ES5 Object.create(obj)原理一样
      //var test = Object.create(obj) 
      var test = sayName(obj);
      //在主要考虑对象而不是自定义类型或构造函数的情况下,可以使用
      //函数可复用性没有体现
      //6.组合寄生继承
      function Person(name) {
        this.name = name;
      }
      function chill(name) {
        Person.call(this,name);
      }
      Person.prototype.sayName = function() {alert('hello')}
      function cons(chil,supe) {
        var prototype = object(supe.prototype);
        prototype.constructor = chill;
        chil.prototype = prototype;
      }
      cons(chill,Person);
      var test = new chill('tom');
      寄生组合式继承:通过借用构造函数来继承属性,通过原型链的混成形式来继承方法.
      思路:不必为了指定子类的原型而调用父类的构造函数,我们所需要的无非就是父类原型的一个副本而已.
      本质上,就是使用寄生式继承来继承父类的原型,然后在将结果指定给子类的原型:
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值