JavaScript 继承 2 借用构造函数

在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数的技术(有时候也叫做伪构造对象或经典继承)。这种技术的基本思想相当简单,即在子类型构造函数的内部调用父类型的构造函数。别忘了,函数只不过是在特定环境中执行代码的对象,因此通过使用 apply() 和 call() 方法也可以在(将来)新创建的对象上执行构造函数,如下所示:

        function SuperColors() {
            this.colors = ["red", "green", "blue"];
        }
        function SubColors() {
            // 继承 SuperColors
            SuperColors.call(this);
        }

        var instance1 = new SubColors();
        instance1.colors.push("white");
        console.log(instance1.colors);
        var instance2 = new SubColors();
        console.log(instance2.colors);

上面代码的输出结果如下:

输出结果
  1. 传递参数

相对于原型链,借用构造函数有一个很大的优势,即可以在子类型构造函数中向父类构造函数传递参数:

        function SuperColors(colorName) {
            this.colors = ["red", "green", "blue", colorName];
        }
        function SubColors() {
            // 继承 SuperColors
            SuperColors.call(this, "black");
        }

        var instance1 = new SubColors();
        instance1.colors.push("white");
        console.log(instance1.colors);
        var instance2 = new SubColors();
        console.log(instance2.colors);

输出结果:

输出结果
  1. 借用构造函数的问题

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 博客内容:什么是面向对象为什么要面向对象面向对象编程的特性和原则理解对象属性创建对象继承 什么是面向对象 面向对象...
    _Dot912阅读 1,447评论 3 12
  • 1.继承(接口继承和实现继承) 继承是 OO 语言中的一个最为人津津乐道的概念。许多 OO 语言都支持两种继承方式...
    believedream阅读 981评论 0 3
  • 前言 原型,作为前端开发者,或多或少都有听说。你可能一直想了解它,但是由于各种原因还没有了解,现在就跟随我来一起探...
    无亦情阅读 679评论 0 8
  • 一、对象的定义在ECMAScript-262中,对象被定义为“无序属性的集合,其属性可以包含基本值,对象或者函数”...
    Jasmine_dc8b阅读 472评论 0 1
  • 我们在聚会的时候,总会留下那么一点笑得气绝的时候。别急,等等哈,准备开场了 虽然有点急,但我一定保持最好的笑容,因...
    宝光蓝蝶阅读 219评论 0 0