ES2015继承的实现

Posted starryi-alpha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES2015继承的实现相关的知识,希望对你有一定的参考价值。

# ES2015继承
class A {
    ma = ‘ma‘;
    static sa = ‘sa‘;
    static sf = () => {
        return ‘sf‘;
    }
}
class B extends A {
}

let b = new B();

以上代码经过Babel编译后为


// 1. 删除检查代码
// 2. 仅使用Object.setProtypeOf和Object.getPrototypeOf设置和访问对象内部[[Prototype]]
function _inherits(subClass, superClass) {
    
    // 设置原型对象,实现原型继承
    subClass.prototype = Object.create(superClass.prototype, {
        constructor: {
            value: subClass,
            enumerable: false,
            writable: true,
            configurable: true
        }
    });
    // 实现静态属性继承
    // subClass.sa === superClass.sa;
    Object.setPrototypeOf(subClass, superClass);
}

var A = function A() {
    this.ma = ‘ma‘;
};

A.sa = ‘sa‘;
A.sf = function() {
    return ‘sf‘;
};

var B = function(_A) {
    // B.prototype = _A.prototype;
    // Object.setPrototypeOf(B, A);
    _inherits(B, _A);
    
    function B() {
        // 初始化父类实例属性
        // _A.apply(this, arguments);
        return Object.getPrototypeOf(B).apply(this, arguments);  
    }
    return B;
} (A);

let b = new B();

以上代码主要做了三件事

  • 通过B.prototype设置构造函数的原型链,实现原型继承
  • 通过Object.setPrototypeOf设置函数对象的的内部原型属性,实现静态属性继承
  • 通过apply,将this和arguments应用到父类构造函数,初始化父类实例属性

javascript静态变量继承的特点

let same = B.sa === A.sa;   // true
let has = B.hasOwnProterty(‘sa‘); // false

PS:
react-redux的connect方法,内部通过判断hasOwnProperty来复制静态变量,所以在出现组件继承时会有如下结果

class SuperComponent extends React.Component {  
    static mSup= {...}
    ...
}
class SubComponent extends SuperComponent { 
    ...
}
let Connect = connect(mapStateToProps)(SubComponent);

Connect.mSup;   // undefined 

当然Facebook并不鼓励使用继承来创建特定组件,而是通过组合实现容器组件和高阶组件


以上是关于ES2015继承的实现的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript高级class类ES6实现继承ES6对象增强

JavaScript高级class类ES6实现继承ES6对象增强

JavaScript 新旧替换四:继承

从 Babel 转译过程浅谈 ES6 实现继承的原理

ES6---Class继承

es6继承 vs js原生继承(es5)