`
bird12010
  • 浏览: 8080 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

寄生组合式继承

 
阅读更多
<!doctype html>
<html>
<head>
<meta charset="utf-8">
    <title>寄生组合式继承</title>
    <script type="text/javascript">
    /*
组合继承是JavaScript 最常用的继承模式;
不过,它也有自己的不足。组合继承最大的问题就是无论什么情况下,都会调用两次超类型构造函数:一次是在创建子类型原型的时候,另一次是在子类型构造函数内部。没错,子类型最终会包含超类型对象的全部实例属性,但我们不得不在调用子类型构造函数时重写这些属性。
    */
      function object(o) {
          function F() {}
          F.prototype = o;
          return new F();
      }

      function inheritPrototype(subType, superType) {
          var prototype = object(superType.prototype); //创建对象
          prototype.constructor = subType; //增强对象
          subType.prototype = prototype; //指定对象
      }

      function SuperType(name) {
          this.name = name;
          this.colors = ["red", "blue", "green"];
      }

      SuperType.prototype.sayName = function() {
          alert(this.name);
      };

      function SubType(name, age) { //当调用SubType 构造函数时,又会调用一次SuperType构造函数,这一次又在新对象上创建了实例属性name和colors。于是,这两个属性就屏蔽了原型中的两个同名属性
          SuperType.call(this, name); //第二次调用SuperType()
          this.age = age;

      }

      SubType.prototype = new SuperType(); //第一次调用SuperType() SubType.prototype 会得到两个属性:name 和colors;它们都是SuperType 的实例属性,只不过现在位于SubType 的原型中。
      SubType.prototype.sayAge = function() {
          alert(this.age);
      };


      var instance1 = new SubType("flyer", 29);
      instance1.colors.push("black");
      alert(instance1.colors); //"red,blue,green,black"
      instance1.sayName(); //"flyer";
      instance1.sayAge(); //29


      var instance2 = new SubType("bing", 27);
      alert(instance2.colors); //"red,blue,green"
      instance2.sayName(); //"bing";
      instance2.sayAge(); //27
    
        
    </script>
</head>
<body>

</body>
</html>

 改进:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
    <title>寄生组合式继承</title>
    <script type="text/javascript">
    /*
这个例子的高效率体现在它只调用了一次SuperType 构造函数,并且因此避免了在SubType.
prototype 上面创建不必要的、多余的属性。与此同时,原型链还能保持不变;因此,还能够正常使用
instanceof 和isPrototypeOf()。开发人员普遍认为寄生组合式继承是引用类型最理想的继承范式。
    */        
        function object(o) {
            function F() {}
            F.prototype = o;
            return new F();
        }

        function inheritPrototype(subType, superType) {
            var prototype = object(superType.prototype); //创建对象
            prototype.constructor = subType; //增强对象
            subType.prototype = prototype; //指定对象
        }

        function SuperType(name) {
            this.name = name;
            this.colors = ["red", "blue", "green"];
        }

        SuperType.prototype.sayName = function() {
            alert(this.name);
        };

        function SubType(name, age) {
            SuperType.call(this, name);

            this.age = age;
        }
         //SubType.prototype = new SuperType(); //第一次调用SuperType() SubType.prototype 
        inheritPrototype(SubType, SuperType);

        SubType.prototype.sayAge = function() {
            alert(this.age);
        };

        var instance1 = new SubType("flyer", 29);
        instance1.colors.push("black");
        alert(instance1.colors); //"red,blue,green,black"
        instance1.sayName(); //"flyer";
        instance1.sayAge(); //29


        var instance2 = new SubType("bing", 27);
        alert(instance2.colors); //"red,blue,green"
        instance2.sayName(); //"bing";
        instance2.sayAge(); //27
       
        
    </script>
</head>
<body>

</body>
</html>

 

分享到:
评论

相关推荐

    浅谈JS继承_寄生式继承 & 寄生组合式继承

    本文主要探讨两种继承模式:寄生式继承和寄生组合式继承。 首先,寄生式继承是一种不直接修改原对象,而是通过创建其副本并在副本上进行增强的方法。这种方式避免了直接操作原对象可能导致的问题。例如,我们有一个...

    JavaScript寄生组合式继承实例详解

    本文实例讲述了JavaScript寄生组合式继承。分享给大家供大家参考,具体如下: 其实《JavaScript高级程序设计》这本书中已经有完整代码了,只要把代码读懂就知道这个继承是怎么回事。 首先,在js中,给对象定义属性有...

    JavaScript寄生组合式继承原理与用法分析

    在JavaScript中实现继承的方法有很多种,其中寄生组合式继承被认为是最高效和优雅的一种方式。 ### 寄生组合式继承的原理 寄生组合式继承的原理是结合了寄生式继承和组合式继承的优点。组合式继承(也称为伪经典...

    [js高手之路]寄生组合式继承的优势详解

    寄生组合式继承是JavaScript中实现继承的一种高效策略,它结合了组合继承和寄生继承的优点,有效地解决了传统组合继承的一些问题。在此模式下,我们可以避免父类构造函数被不必要的多次调用,同时还能保留父类原型上...

    【JavaScript源代码】深入JS继承.docx

    本文主要探讨五种经典的继承方式:原型式继承、原型链式继承、借用构造函数(类式继承)、组合继承以及寄生组合式继承。 1. **原型式继承**: 原型式继承是通过创建一个新对象,使其原型指向另一个对象,从而实现...

    浅谈js对象的创建和对6种继承模式的理解和遐想

    本文将探讨JavaScript中对象的创建方式以及六种常见的继承模式,包括原型链继承、借用构造函数继承、组合继承、原型式继承、寄生式继承以及寄生组合式继承。 首先,让我们从对象的创建开始谈起。在JavaScript中创建...

    java script 继承的实现

    在 JavaScript 中,继承主要通过原型链(prototype chain)、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承等方法实现。以下是对这些继承方式的详细解释: 1. **原型链继承**:这是 JavaScript ...

    javascript关于继承解析_.docx

    这里我们将深入探讨几种主要的继承方式:原型式继承、寄生式继承和寄生组合式继承。 ### 原型式继承 在JavaScript中,对象有一个名为`__proto__`的内部属性,指向创建该对象的构造函数的原型。原型式继承利用了这...

    学习javascript面向对象 javascript实现继承的方式

    寄生组合式继承是目前最理想的继承方式,它避免了组合继承中调用两次构造函数的问题。这种继承方法只调用一次超类型构造函数,并且因此只创建一次超类型原型。 优点: - 最有效的一种继承方式,只调用一次超类型...

    javascript继承的六大模式小结

    本文将深入探讨JavaScript继承的六大模式:原型链、借用构造函数、组合继承、原型式继承、寄生式继承以及寄生组合式继承。 1. **原型链** 原型链是JavaScript中最基础的继承方式,通过原型对象的引用实现。每个...

    【JavaScript源代码】简单谈谈JavaScript寄生式组合继承.docx

    除了寄生式组合继承之外,还有一种叫做**寄生式继承**的方式。它主要是通过一个函数包装一个对象,然后返回这个函数的调用结果,从而创建一个新的对象。这种方式可以给对象添加额外的功能,而不改变其原有的类型。 ...

    js实现的七种继承方式.md

    使用js实现继承的七种方式,详细讲解了js中的原型链继承,构造函数继承,组合继承(经典继承),原型式继承,寄生式继承,寄生组合式继承,以及ES6中的继承,描述原理以及实现和要点概述等。

    JS继承笔记.7z

    - 寄生组合式继承解决了构造函数继承的缺点,通过在子类构造函数内部调用父类构造函数,并利用工厂函数创建实例,避免了属性的重复。 6. 寄生继承: 主要用于改善对象的创建,通过一个辅助函数创建原始对象的副本...

    JS封装和继承-入门级

    5. **寄生组合式继承**:结合了寄生式继承和组合继承的优点,是JavaScript中推荐的继承方式,可以在`Javascript面向对象编程(三):非构造函数的继承.docx`中找到更详细的解释。 例如,使用寄生组合式继承: ```...

Global site tag (gtag.js) - Google Analytics