寄生组合继承

* 因为组合式继承会两次调用超类型的构造函数,
* 一次是在创建子类型原型的时候,将超类型的属性添加到自类型的原型上,
* 另一次是在子类型构造函数内部调用,将原型上的属性创建到自己身上,
* 实现屏蔽超类型同名的属性

寄生组合式继承
* 通过借用构造函数继承属性,通过原型链的混成形式继承方法.
* 基本思路:不必为了指定子类型的原型而调用草类型的构造函数,我们所需要的无非就是给超类型原型的一个副本而已.本质上,就是使用寄生式继承来继承超类型的原型,然后将结果指定给子类型的原型.寄生组合式继承的基本模式:

    function inheritPrototype(subType,superType) {
        var prototype = Object(superType.prototype);//创建对象
        prototype.constructor = subType;            //增强对象
        subType.prototype = prototype;              //指定对象
    }
* 这个示例中inheritPrototype()函数实现了寄生组合式继承的最简单形式.两个参数,子类型和超类型.
* 在函数内部,
* 第一步:创建一个对象存储着超类型的原型,当做超类型的原型的副本,有着超类型定义在原型中的方法;
* 第二部:创建的副本包含超类型所有的属性,包括constructor,将constructor指向子类型;
* 第三步:将加工完成的超类型的原型给子类型的原型,实现继承.
* 这样省去了SubType.prototype = new SuperType; 省了一次调用超类型的构造函数,而且子类型不在是超类型的实例
   //对比组合继承
   function SuperType(name) {
       this.name = name;
       this.color = ['red','green','blue'];
   }

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

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

   inheritPrototype(SubType,SuperType);

   // Object.defineProperty(SuperType.prototype,'constructor',{
   //     value:SuperType,
   //     enumerable:false
   // });

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

   var instanceSub = new SubType('sub',20);
   console.log(instanceSub);
   instanceSub.sayName();

   var instanceSup = new SuperType('sup');
   console.log(instanceSup);
   instanceSup.sayName();
   instanceSup.sayAge();
	

但是不明白为什么子类型的prototype.constructor指向SubType正常,
而超类型的prototype.constructor也指向SubType,不应该指向它自己吗?,
而且超类型调用子类型在原型上定义的方法,还不报错。
求求哪位路过的大佬给讲解一二 ^ . ^,不胜感谢!
在这里插入图片描述

发布了68 篇原创文章 · 获赞 89 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/printf_hello/article/details/104286026