首页 > 解决方案 > 新创建的 CustomEvent 没有自己的属性(“类型”)所以 jQuery 失败了?

问题描述

我在一个非常基本的类上工作,它使用(非常)私人事件。

因为我不希望这个类依赖于 jQuery,所以我使用 plain CustomEvents(虽然我使用 jQuery)

惊喜一是 jQuery 未能触发我的事件,惊喜二是 jQuery 正在hasOwnProperty("type")对 CustomEvent 进行测试,这是 FALSE

简而言之:(编辑:JunctionEvent误导了 - 它只是一个字符串“ju-ac” - 所以我在我的例子中改变了它)

    junctionevent = "ju-ac"

    e = new CustomEvent(junctionevent, {bubbles: options.bubbles, composed: true})
    console.log e, e.type, e.hasOwnProperty("type")

说(“ju-ac”是此开发阶段中事件的名称或类型):

ju-ac { target: null, isTrusted: false, eventPhase: 0, bubbles: true, cancelable: false, returnValue: true, defaultPrevented: false, composed: true, timeStamp: 9808, cancelBubble: false, … }
 ju-ac 
 false

所以事件有一个“属性”类型,有一个名称“ju-ac”但没有一个属性命名类型?

我错了什么?(或者 jQuery 做错了什么?)

编辑:我刚刚了解到,jQuery 无法将普通的 CustomEvents 处理为事件输入,它处理这些事件数据(就像输入中的任何其他对象一样) - 这个赌注我输了。这不会改变我的问题,:为什么在创建属性后有事件type带有字符串“xxxx”但 hasOwnProperty("type") 返回 FALSE的属性后事件

标签: javascriptjquery

解决方案


之所以type在新创建的 CustomEvent 实例中看到该属性,同时在false使用hasOwnProperty('type')方法调用时得到,是因为 type 属性是Event通过原型链从 Object 继承的属性,而不是直接拥有的属性新创建的实例。

因此,实例e从它的构造函数继承属性CustomEvent,而CustomEvent从它自己的构造函数继承属性,Event对象是属性的所有者type

您可以沿着原型链一直到EventObject 并查看hasOwnProperty("type")返回 true 的方式,如下所示:

let e = new CustomEvent("ju-ac");

e.type; // "ju-ac";
e.hasOwnProperty("type");   // false

// One step deep into the prototype chain
e.__proto__.constructor;   // CustomEvent
e.__proto__.hasOwnProperty("type");   // false

// Two steps deeper into the prototype chain
e.__proto__.__proto__.constructor;   // Event
e.__proto__.__proto__.hasOwnProperty("type");   // true

事件:“CustomEvent,我是你爸爸!”

自定义事件:“不!”


推荐阅读