前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript原型链继承与盗用构造函数继承

JavaScript原型链继承与盗用构造函数继承

作者头像
大熊G
发布2022-11-14 16:46:46
3910
发布2022-11-14 16:46:46
举报

theme: channing-cyan

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

昨天我们讲解了原型和原型链,今天我们说一下继承,顺便再重温一下原型链

什么是继承

继承这个词比较容易理解,很多东西我们没有,但是我们的父亲有,我们就可以拿我们父亲的来用。这个就是继承。我们直接上干货。

原型链继承

原型链继承是js中的主要继承方式,它的基本思想就是通过原型继承多个引用类型的属性和方法。

代码语言:javascript
复制
// 原型链
     function SuperType() {
        this.property = true;
    }
    SuperType.prototype.getSuperValue = function () {
        return this.property;
    };

    function SubType() {
        this.subproperty = false;
    }
    //继承SuperType
    SubType.prototype = new SuperType();
    SubType.prototype.getSubValue = function () {
        return this.subproperty;
    };
    let instance = new SubType();
    console.log(instance.getSuperValue()); // true

以上代码定义了俩个类型 SuperType和SubType,这里SubType就是继承了SuperType。这个赋值重新更改了SUbType的最初原型,替换成了SuperType实例。这样意味着SuperType实例可以访问所有的属性和方法也存在与SubType.protoype。

这样一来,SubType 的实例不仅能从 SuperType 的实例中继承属性和方法,而且还与 SuperType 的原型挂上了钩。于是 instance(通过内部的Prototype)指向SubType.prototype,而 SubType.prototype(作为 SuperType 的实例又通过内部的Prototype)指向 SuperType.prototype。所有输出的是true。

原型链的搜索机制就是在读取实例上的属性时,首先在自身的实例上进行搜索,如果没找到,就会通过继承的方式继续搜索,搜索是向上的。对于属性和方法一直会持续到原型链末端

原型链虽然是比较强大的继承实现工具,但是它里面所有的引用值都是实例间共享的,而且子类不能向父类传参,一般原型链也不会被单独使用,我们可以通过盗用构造函数配合来解决这些问题。

盗用构造函数

盗用构造函数有时候也被一些人叫做“对象伪装”或“经典继承”。这个思路很简单,在字类构造函数中调用父类构造函数。我们可以用.call()和.apply()将父类构造函数引入子类函数。

代码语言:javascript
复制
 //盗用构造函数
    function SuperType() {
        this.names = ["jackson", "bear"];
    }

    function SubType() {
        // 继承 SuperType
        SuperType.call(this);
    }
    let instance1 = new SubType();
    instance1.names.push("daxiong");
    console.log(instance1.names); // ["jackson", "bear", "daxiong"]
    let instance2 = new SubType();
    console.log(instance2.names); // ["jackson", "bear"]

上面的代码就是盗用构造函数的调用,通过使用call()(也可以使用apply()),SuperType构造函数在为SubType的实例创建的新对象执行后,相当于新的SubType对象运行了SuperType()函数中的所有初始化代码。每个实例都会有自己的names属性。

我们再说一下传递参数

代码语言:javascript
复制
 //盗用构造函数传参
    function SuperType(name) {
        this.name = name;
    }

    function SubType() {
        // 继承 SuperType 并传参
        SuperType.call(this, "Jackson");
        // 实例属性
        this.age = 22;
    }
    let instance = new SubType();
    console.log(instance.name); // "Jackson";
    console.log(instance.age); // 22 

这里SuperType构造函数接受了一个参数name,在SubType构造函数调用SuperType的时候传入了这个参数。所以会在 SubType 的实例上定义 name 属性。我们也可以访问到这个属性的值。

盗用构造函数也有一定的问题 1、只能继承父类构造函数的属性。 2、无法实现构造函数的复用。(每次用每次都要重新调用) 3、每个新实例都有父类构造函数的副本,臃肿。

我们下个文章再讲解一下如何解决些问题

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • theme: channing-cyan
  • 什么是继承
    • 原型链继承
      • 盗用构造函数
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档