IE10以下类静态变量继承

感谢 Babel,我们可以在项目中使用 es6 语法开发项目,大大提升开发效率。

但是,在 IE<=10 中,我们需要留意一个 Babel 翻译的处理,那就是 ES6 类继承语法。

class Root {
  static displayName = 'Root'
}

class Model extends Root {}

Model.displayName // 'Root'

如上代码中,Model.displayName 应该为 'Root',但是在 IE<=10 中 displayName 不会被继承。

因为,上述 ES6 继承 Babel 会转换成 _inherts 继承。

function _inherits(subClass, superClass) {
  if (typeof superClass !== 'function' && superClass !== null) {
    throw new TypeError(
      'Super expression must either be null or a function, not ' +
        typeof superClass
    )
  }
  subClass.prototype = Object.create(superClass && superClass.prototype, {
    constructor: {
      value: subClass,
      enumerable: false,
      writable: true,
      configurable: true
    }
  })
  if (superClass)
    Object.setPrototypeOf
      ? Object.setPrototypeOf(subClass, superClass)
      : (subClass.__proto__ = superClass)
}

static 变量值继承主要依赖下面这一段代码

Object.setPrototypeOf
  ? Object.setPrototypeOf(subClass, superClass)
  : (subClass.__proto__ = superClass)

但是在 IE<=10 中,Object.setPrototypeOf 方法未被定义!同时 IE<=10 中不存在 __proto__ 原型。

所以,如果需要继承类的静态变量,需要使用 babel-plugin-transform-proto-to-assign 将 bar.__proto__ = foo 赋值,转换为

var _defaults = function(obj, defaults) {
  var keys = (0, _getOwnPropertyNames2.default)(defaults)

  for (var i = 0; i < keys.length; i++) {
    var key = keys[i]
    var value = (0, _getOwnPropertyDescriptor2.default)(defaults, key)

    if (value && value.configurable && obj[key] === undefined) {
      ;(0, _defineProperty2.default)(obj, key, value)
    }
  }

  return obj
}

_defaults(bar, foo)

注意 如果使用了 babel-plugin-transform-runtime 插件,将一些通用的方法转换成 require('babel-runtime/...')
则需要在 webpack JS loader 中 include 字段加入如下片段:

include: [
  // 包括 babel inherts 处理,兼容 ie10
  // babel-plugin-transform-proto-to-assign
  // 将 inherits.js 中的 subClass.__proto__ = superClass 进行转换
  /\/node_modules\/babel-runtime\/helpers\/inherits/
]

遗留问题

虽然用上诉方式可以解决普通静态变量的继承问题,但是对于 Symbol 类型的 static 变量,上诉方法还是不能生效!

TODO

考虑将 _defaults 方法,使用 Object.getOwnPropertySymbols 方法进行 Symbol 类型的处理?

猜你喜欢

转载自blog.csdn.net/u014628388/article/details/81082354
今日推荐