• js高程(二)-----继承


    首先来讨论一下原型链,上代码

     1 function SuperType(){
     2     this.property = true;
     3   }
     4 
     5   SuperType.prototype.getSuperValue = function(){
     6     console.log(this.property);
     7   }
     8 
     9   function SubType(){
    10     this.subproperty = false;
    11   }
    12 
    13   SubType.prototype = new SuperType();
    14 
    15   SubType.prototype.getSubValue = function(){
    16     console.log(this.subproperty);
    17   }
    18 
    19   var instance = new SubType();
    20 
    21   console.log(instance.getSuperValue());//true

    前三行创建了一个名为SuperType的构造器,并为其添加了一个属性propertype,其值设为true,然后在SuperType的原型上添加方法getSuperValue,功能是输出属性property的值,第一个构造函数完毕。9到11行创建第二个构造函数并添加属性subproperty,其值设为false。重点部分:第13行,把一个SuperType的实例赋值给SubType的原型。后面同样为SubType的原型添加一个方法。然后创建一个Subtype的实例,调用getSuperValue方法,返回true。 

    下面来仔细分析一下这条原型链,首先创造一个构造函数SuperType,它指向自己的原型,而原型的constructor有指向SuperType,这是第一部分,第二次创造了新的构造函数SubType,它的实例instance指向它的原型,而它的原型已经被设定为一个SuperType的实例,而这个实例又指向SuperType的原型,所以这部分和刚刚的第一部分就联系起来了,问题来了,instance。constructor是谁?沿着刚刚说的原型链向上找,

    console.log(instance.constructor);//SuperType

    同理,SuperType其实还能沿着原型链向上,上面就是Object。

    第二种:借用构造函数,上代码:

     1 function SuperType(name){
     2     this.name = name;
     3   }
     4 
     5   function SubType(){
     6     SuperType.call(this,"jiangjie");
     7     this.age = 20;
     8   }
     9 
    10   var instance = new SubType();
    11 
    12   console.log(instance.name);//jiangjie
    13   console.log(instance.age);//20
    14 
    15   console.log(instance.constructor);//Subtype
    16   console.log(Object.getPrototypeOf(instance)==SubType.prototype);//true
    17 
    18   console.log(instance.hasOwnProperty("name"));//true

    这样的写法就更容易理解了,使用call只是使用了Supertype的属性,但是并没有改动任何的原型链,我们可以使用hasOwnProperty来证明并不是调用了SuperType作为原型,

    第三种:组合继承,上代码

     1 function SuperType(name){
     2     this.color = ['red','black','white'];
     3     this.name = name;
     4   }
     5 
     6 
     7   SuperType.prototype.sayName = function(){
     8     console.log(this.name);
     9   }
    10 
    11   function SubType(name,age){
    12     SuperType.call(this,name);
    13     this.age = age;
    14   }
    15 
    16   SubType.prototype = new SuperType();
    17 
    18   SubType.prototype.sayAge = function(){
    19     console.log(this.age);
    20   }
    21 
    22   var instance1 = new SubType('jaingjie','20');
    23   var instance2 = new SubType('lukexin','20');
    24 
    25   instance1.color.push('green');
    26   console.log(instance1.color);//['red','black','white','green'];
    27   console.log(instance1.sayName());//jiangjie
    28   console.log(instance1.sayAge());//20
    29 
    30   console.log(instance2.color);//['red','black','white'];
    31   console.log(instance2.sayName());//lukexin
    32   console.log(instance2.sayAge());//20

    说白了就是改进版,集中各个方法所长,使用 借用构造函数 方法,来设定各自实例属性,通过原型来设定通用的方法,但是要注意,为了确保构造函数不会重写子类的属性,要在调用超类型构造函数以后,再为子类添加属性

  • 相关阅读:
    HTML5 新增元素梳理
    HTML布局梳理
    ES6中新增let命令使用方法
    xml学习-语法规则
    初步了解URL
    JavaScript——装饰者模式
    移动视频技术——新增API可手工修正视频方向
    如何在移动视频开发中使用ip组播技术
    Windows平台AnyChat视频显示
    如何实现音频合成立体声录制?
  • 原文地址:https://www.cnblogs.com/aichihuamei/p/6602037.html
Copyright © 2020-2023  润新知