为什么谷歌闭包编译器在扩展Date()的ES6对象上失败
Why is Google Closure Compiler failing on my ES6 object which extends Date()?
请注意:这个问题涉及到谷歌闭包编译器的使用。它不是直接关于ES6的,因为那部分正在工作。
我在ES6中写了一个类,它扩展了本机Date对象。这是一个很大的类,但这是一个简化的版本:
class Dative extends Date {
constructor (dateData) {
super();
super.setTime(Date.parse(dateData));
}
addMilliseconds (ms) {
super.setTime(super.getTime() + ms);
}
}
上面的代码在Chrome和Firefox中运行良好。然而,当我通过闭包编译器传递它时,它会抛出错误:
Uncaught TypeError: Method Date.prototype.setTime called on incompatible receiver [object Object]
Update:调用本机Date方法在编译版本中也会失败,但未编译时可以正常工作,并显示一条消息说这不是Date对象。
我不明白的是为什么以原始形式工作的代码在编译后会中断。
是我做错了什么,还是这是一个编译器错误?
我使用的是最新版本的compiler.jar。作为参考,这是闭包编译器产生的结果:
var $jscomp = {
scope: {},
inherits: function(a, b) {
function d() {}
d.prototype = b.prototype;
a.prototype = new d;
a.prototype.constructor = a;
for (var c in b)
if (Object.defineProperties) {
var e = Object.getOwnPropertyDescriptor(b, c);
e && Object.defineProperty(a, c, e)
} else
a[c] = b[c]
}
}
, Dative = function(a) {
Date.call(this);
Date.prototype.setTime.call(this, Date.parse(a))
};
$jscomp.inherits(Dative, Date);
Dative.UTC = Date.UTC;
Dative.parse = Date.parse;
Dative.now = Date.now;
Dative.prototype.addMilliseconds = function(a) {
Date.prototype.setTime.call(this, Date.prototype.getTime.call(this) + a)
};
//# sourceMappingURL=./DativeShort.map
Date
在ES5中不可子类化。所以你想要的在ES5环境中是不可能实现的。
编译后的代码也不能在ES6环境中工作。来自规范
Date构造函数被设计为可子类化的。它可以用作类定义的extends子句的值。想要继承指定的Date行为的子类构造函数必须包含对Date构造函数的超调用,以创建和初始化具有[[DateValue]]内部槽位的子类实例。
如果不调用super
,它将无法工作。Date.call(this);
不起作用。基本上,如果你将代码编译到ES5,子类化内置类型是不允许的。
所以这不是Google Closure的问题
相关文章:
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- ES6 const,用于在JavaScript中创建对象原型;这是一种模式吗
- ES6非结构化中的计算属性-非结构化整体对象
- 创建一个类,该类使用es6类语法将Function对象创建为实例
- ES6类型表示可以反转的键值对象
- 在 es6 中迭代对象并返回新对象
- 如何使用ES6将两个具有函数的对象合并为一个新对象
- 如何将普通对象转换为ES6映射
- ES6 Set 允许重复数组/对象
- 是否可以将ES6导入直接添加到对象上
- 如何在ES6中使用Arrow函数引用对象内部的其他函数
- 我应该如何保留对'options对象'在ES6实例中
- ES6对象简写表示法可以与常规对象表示法相结合吗
- ES6 对象分配部分项
- ES6对象正在破坏默认参数
- ES6对象.forOwn循环遍历对象键的功能
- babel对ES6对象解构的实现是否正确?
- 为什么谷歌闭包编译器在扩展Date()的ES6对象上失败
- ES6 对象中的方法:使用箭头函数
- ES6:对象之间的回调函数