感谢 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
类型的处理?