class继承做了什么?

目的

以babel编译的class继承为基础,了解目前class继承的原理

理解过程

babel编译结果

Reference: babel Try it out!

class a extends b{
  constructor(){
    super()
    this.c= "haha"
  }
}
复制代码

被编译为

继承做了什么?

第一步 _inherits(a,_b)实现继承
function _inherits(subClass, superClass) {
  if (typeof superClass !== 'function' && superClass !== null) {
    throw new TypeError('Super expression must either be null or a function');
  }
  subClass.prototype = Object.create(superClass && superClass.prototype, 
    { constructor: { value: subClass, writable: true, configurable: true } });
  if (superClass) _setPrototypeOf(subClass, superClass);
}
复制代码

其中重要的是:

1、实现原型链继承:subClass.prototype.__proto__ = superClass.prototype

subClass.prototype = Object.create(superClass && superClass.prototype, 
    { constructor: { value: subClass, writable: true, configurable: true } });
解释:
    Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__;
    现有对象是superClass.prototype,新创建对象是subClass.prototype;
    将现有对象赋给新创建的对象的__proto__
结论:
    这一步实现了原型链的继承
复制代码

reference: MDN Object.create()

2、实现静态属性继承:subClass.__proto__ = superClass

function _setPrototypeOf(o, p) {
  _setPrototypeOf =
    Object.setPrototypeOf ||
    function _setPrototypeOf(o, p) {
      o.__proto__ = p;
      return o;
    };
  return _setPrototypeOf(o, p);
}
if (superClass) _setPrototypeOf(subClass, superClass);

解释:
    _setPrototypeOf(subClass, superClass)设置subClass的__proto__为superClass;
    这样所有通过subClass.property访问的属性如果在subClass上找不到,就会去superClass上找
结论:
    这一步实现了静态属性的继承
复制代码
第二步 return constructor返回构造函数

其中重要的是:

3、调用父类的构造函数:super()

function _possibleConstructorReturn(self, call) {
  if (call && (_typeof(call) === 'object' || typeof call === 'function')) {
    return call;
  }
  return _assertThisInitialized(self);
}

function _assertThisInitialized(self) {
  if (self === void 0) {
    throw new ReferenceError("this hasn't been initialised - 
    super() hasn't been called");
  }
  return self;
}

function _getPrototypeOf(o) {
  _getPrototypeOf = Object.setPrototypeOf
    ? Object.getPrototypeOf
    : function _getPrototypeOf(o) {
        return o.__proto__ || Object.getPrototypeOf(o);
      };
  return _getPrototypeOf(o);
}

_this = _possibleConstructorReturn(this, _getPrototypeOf(a).call(this));

解释:
    根据第一步的第二点subClass.__proto__ = superClass;
    于是_getPrototypeOf(a)返回的是a.__proto__也就是superClass;
    因此_this = superClass.call(this);
    父类中挂在this上的属性就被挂到子类的this上了
结论:
    这一步实现了父类构造函数的调用
复制代码

结论

目前的class继承主要实现了以下继承效果

1、原型链继承

2、静态属性继承

3、调用父类构造函数以获得父类构造函数this上的属性

转载于:https://juejin.im/post/5cea3379f265da1b8466c163

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值