在我贡献的一个 JavaScript 库(Node 和浏览器)中(IndexedDBShim),为了完整的测试覆盖率,我希望确保我们不仅可以更好地通过与 IndexedDB 相关的一般 W3C 测试,还可以通过基于 WebIDL 的测试与 IndexedDB 相关的接口测试。
为此,当我运行 W3C 的 WebIDL 测试Event
并CustomEvent
与我们正在使用的 Event polyfill 接口时,在解析后变得明显的一个测试要求interface CustomEvent : Event
是必须将 的原型CustomEvent
设置为Event
. 请注意,我不是指CustomEvent
对象Event
的原型必须从(alaCustomEvent.prototype = new Event();
或)继承的任何要求,请注意,CustomEvent.prototype = Object.create(Event);
负责类的对象的原型(构造函数CustomEvent
)设置为Event
而不是默认值, Function.prototype
)。
果然,在 Chrome 的控制台中,我看到对于内置接口,Object.getPrototypeOf(CustomEvent) === Event
确实是true
. 据我所知,我可以在 polyfill 中实现这一点的唯一(基于标准的)方法是执行以下操作:
function ShimEvent () {}
function ShimCustomEvent () {}
Object.setPrototypeOf(ShimCustomEvent, ShimEvent);
...但我在MDN上看到警告说这种方法在所有浏览器中都很慢。
我想我只需要选择性能损失是否值得更大的标准合规性。
但是,无论如何,我仍然希望更好地了解以这种方式继承接口的后果是什么(也许这更多的是我对 JavaScript 的理解而不是 WebIDL 本身的问题) .
由于函数对象原型之间仅存在这种关联,因此继承接口的方法不会被基接口继承,因此期望类函数之间的原型连接仅表示接口之间的继承层次为了任何可能希望在代码中反省它们的人?或者对于类原型连接的这个特殊要求还有其他一些实际后果吗?