JS 中的继承小结

发布于 2022-07-02 12:12:23 字数 2226 浏览 1037 评论 1

构造超类

function Super() {
  this.name = "AA"
}
Super.prototype.getName = function () {
  console.log(this.name)
};

1.原型继承

让子类的原型指向超类的一个实例,就会拥有实例私有的属性。通过实例的 __proto__ 找到超的原型,里面的属性和方法一样可以找到。即 var sub=new Sub(); sub 拥有 Super 的私有和原型上的属性和方法。

核心理念:通过 增加 sub 子类和 super 超类之间的原型链链接,让 Sub 的实例能找到 Super 的原型和私有属性,以后 Super 的原型上添加方法。sub 依然可以找到

function Sub() {}
Sub.prototype=new Super();

var sub = new Sub();
console.log(sub.name);
sub.__proto__.name = 'BB';
sub.getName();
console.log(Sub.prototype);
var sub1 = new Sub();
console.log(sub1.name);
console.dir(sub.__proto__);

2.call 继承

只会继承私有的,实例化的时候调用父类的构造函数

function Sub() {
  Super.call(this);
}
var sub = new Sub();
console.log(sub.name)

3. 对象冒充继承

实例化的时候,把父级私有的公有的都遍历出来,都加到子级的实例私有属性上。没有原型链的联系

 function Sub() {
  var super1 = new Super;
  for(var key in super1){
    this[key] = super1[key];
  }
  super1 = null;
}
var sub = new Sub();
console.log(sub.name);
sub.getName();

4.组合继承

我们的 cal l继承,继承了私有的。缺少公有的方法。那我们可以用 call+原型继承 来实现公有属性的继承。 好处是私有的还在实例的私有属性上,每一个实例都有自己的。通过原型链也可以找到公有的属性。缺点是原型上多了一份私有的属性。 超级的构造函数也执行了两次

5. 中间类继承

一种在 超类和 子类加了一层原型链的方式 .当然只是继承原型上的方法,也就是公有的。 最坑的地方就是不兼容 不然用这个 + call继承 可以完美实现 继承

function Sub() {}
Sub.prototype.__proto__ = Super.prototype;
var sub = new Sub();
console.log(sub.getName);

6. 寄生组合

综合以上的继承方法,我们想实现那种 私有的属性是私有的,公有的就在原型上。只能用 组合式的继承来实现。把共享的属性、方法用原型链继承实现,独享的属性、方法用借用构造函数实现,所以组合继承几乎完美实现了 js 的继承。

但是一个 bug 就是 原型上多了 私有的属性。而且让超类构造函数执行两次。

现在的 ECMAscript 提供了一个 方法, Object.create(proto,[propertiesObject]),返回一个对象。该对象的原型 指向 Super.prototype

function Sub() {}
Sub.prototype = Object.create(Super.prototype);

console.log(Sub.prototype); 
这样子类就继承了超类 公有的方法

但是 ES5 兼容性 我们需要自己写一个 Objectcreate 方法

function objectCreate(o) {
  function Temp() {}    
  Temp.prototype = o;
  return new Temp();
}
function Sub() {}
Sub.prototype = objectCreate(Super.prototype);
var sub = new Sub;
console.log(sub.getName)

我创建一个仅用于 封装继承的函数 用这个当做 Super 类的副本 实现共享原型,但是由于这个 副本 不会被操作,也就不用担心 超类的原型被修改。然后让子类 去继承这个副本的原型。 创建一个实例,让子类的原型指向这个实例。即实现了原型链的继承,还不会影响超类的原型。 而且以后调用 父类的构造函数了,只需要执行这个副本函数。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

囍笑 2022-05-02 23:47:58

可以更新一波了:class extends, util.inherits

~没有更多了~

关于作者

梦在夏天

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

已经忘了多久

文章 0 评论 0

15867725375

文章 0 评论 0

LonelySnow

文章 0 评论 0

走过海棠暮

文章 0 评论 0

轻许诺言

文章 0 评论 0

信馬由缰

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文