写点什么

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

作者:大熊G
  • 2022 年 6 月 08 日
  • 本文字数:1405 字

    阅读完需:约 5 分钟

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

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

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

// 原型链function SuperType() {this.property = true;}SuperType.prototype.getSuperValue = function () {return this.property;};

function SubType() { this.subproperty = false;}//继承SuperTypeSubType.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()将父类构造函数引入子类函数。


//盗用构造函数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 属性。我们再说一下传递参数//盗用构造函数传参 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、每个新实例都有父类构造函数的副本,臃肿。


发布于: 刚刚阅读数: 5
用户头像

大熊G

关注

每天都在写bug的硬核男人 2022.06.02 加入

前端

评论

发布
暂无评论
JavaScript原型链继承与盗用构造函数继承_JavaScript_大熊G_InfoQ写作社区