• 借用构造函数实现继承


    // 在子类型构造函数的内部调用超类型的构造函数
    // 别忘了,函数只不过是在特定环境中执行代码的对象,因此,通过使用call()和apply()也可以在新创建的对象上执行构造函数

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

    function SubType(){
    // 继承了SuperType
    SuperType.call(this);  //借调了超类型的构造函数

    }

    var instance1=new SubType();
    instance1.colors.push("yellow");
    console.log(instance1.colors);

    var instance2=new SubType(); // ["red", "blue", "green", "yellow"]
    console.log(instance2.colors);// ["red", "blue", "green"]

    // 通过使用call()或apply(),实际上是在新创建的SubType实例的环境下调用了SuperType构造函数,这样一来,就会在,新SubType对象上执行
    SuperType()函数中定义的所有对象初始化代码。结果,SubType的所有实例都会有自己的colors属性。

     1.传递参数

    // 相对于原型链而言,借用构造函数有很大的优势,即可以在子类型构造函数中向超类型构造函数传递参数
    // 看下面的例子

    function SuperType(name){
    this.name=name;
    }

    function SubType(){
    // 继承了SuperType,同时还传递了参数
    SuperType.call(this,"summer");
    // 实例属性
    this.age=20;
    }

    var instance1=new SubType();
    console.log(instance1.name); // summer
    console.log(instance1.age); // 20

    // 在SubType构造函数内部调用SuperType构造函数时,实际上是为SubType的实例设置了name属性。
    // 为了确保SuperType构造函数不会重写子类型的属性,可以在调用超类型构造函数后,再添加子类型独有的属性。

    2 、借用构造函数的问题

    // 如果仅仅是调用构造函数,那么也无法避免构造函数存在额问题,---方法都在构造函数中定义,因此函数复用就无从谈起了。
    // 而且,在超类型的原型中定义的方法,对子类型而言是不可见的,结果,所有类型都只能使用构造函数模式,考虑到这些问题,
    // 借用构造函数的技术也是很少单独使用的。


     
  • 相关阅读:
    linux 配置nginx+php-cgi
    有个故事
    2014短学期实习报告
    快速排序
    C++之共用体
    不能言传,等于不会
    java 动态绑定
    编程的理论深度
    Java 多客户端版 2048 源码
    热河看待苦难
  • 原文地址:https://www.cnblogs.com/liululu/p/5865550.html
Copyright © 2020-2023  润新知