事件与CustomEvent

Ser*_*aev 24 javascript dom-events

我想知道,目的是什么CustomEvent,因为它可以很容易被老人模仿Event.

那么,有什么区别:

var e = new Event("reload");
e.detail = {
    username: "name"
};
element.dispatchEvent(e);
Run Code Online (Sandbox Code Playgroud)

var e = new CustomEvent("reload", {
    detail: {
        username: "name"
    }
});
inner.dispatchEvent(e);
Run Code Online (Sandbox Code Playgroud)

CustomEvent如果很容易将自定义数据附加到普通的Event对象,为什么会存在?

Ori*_*iol 23

这是不一样的.您无法设置detail真正的CustomEvent:

var event = new CustomEvent('myevent', {detail:123});
event.detail = 456; // Ignored in sloppy mode, throws in strict mode
console.log(event.detail); // 123

var event = new Event('myevent');
event.detail = 123; // It's not readonly
event.detail = 456;
console.log(event.detail); // 456
Run Code Online (Sandbox Code Playgroud)

是的,你可以使用Object.defineProperty.但我想重点是该论点CustomEvent应该设置一些事件的内部数据.现在它只考虑detail,内部没有使用.但是未来的规范可能会添加一些新东西,然后您可能无法通过使用属性来设置内部数据.

CustomEvent也继承自CustomElement.prototype.这只是添加detail和弃用initCustomEvent.但是您可以在其中添加自己的方法或属性,这些方法或属性不会被其他事件继承.但我不建议这样做,你不应该修改你不拥有的对象.

因此,基本上您可以使用CustomEvent以便以不同于其他事件的方式对事件进行分类.从旧规范中查看此图形

  • 现在已经过去6年多了,我仍然认为这是一个非常奇怪的决定。他们可以重新定义“Event”构造函数,而不是创建一个新的单独的无意义类“CustomEvent”。或者他们可以简单地鼓励用户扩展“Event”,就像“Error”一样。 (9认同)
  • 但为什么........ (6认同)
  • @trusktr 哈哈,你的评论完美地总结了我读到这个类存在的奇怪理由时的感受 (2认同)