summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
author迷渡 <justjavac@gmail.com>2019-03-30 20:18:19 +0800
committerRyan Dahl <ry@tinyclouds.org>2019-03-30 08:18:19 -0400
commit51c6f33f64c7e805b789aec9a28f62d09b91a3a4 (patch)
tree59baf18ebc0b997f340ae2e6e32b7e802adc88d7 /js
parent3d6c033369a75b7eea7b4fa6be36696b613b1606 (diff)
Avoid search prototype chain (#2019)
Diffstat (limited to 'js')
-rw-r--r--js/event_target.ts6
-rw-r--r--js/event_target_test.ts23
2 files changed, 26 insertions, 3 deletions
diff --git a/js/event_target.ts b/js/event_target.ts
index 98b7bbcb8..52e52b03a 100644
--- a/js/event_target.ts
+++ b/js/event_target.ts
@@ -14,7 +14,7 @@ export class EventTarget implements domTypes.EventTarget {
listener: domTypes.EventListenerOrEventListenerObject | null,
_options?: boolean | domTypes.AddEventListenerOptions
): void {
- if (!(type in this.listeners)) {
+ if (!this.listeners.hasOwnProperty(type)) {
this.listeners[type] = [];
}
if (listener !== null) {
@@ -27,7 +27,7 @@ export class EventTarget implements domTypes.EventTarget {
callback: domTypes.EventListenerOrEventListenerObject | null,
_options?: domTypes.EventListenerOptions | boolean
): void {
- if (type in this.listeners && callback !== null) {
+ if (this.listeners.hasOwnProperty(type) && callback !== null) {
this.listeners[type] = this.listeners[type].filter(
listener => listener !== callback
);
@@ -35,7 +35,7 @@ export class EventTarget implements domTypes.EventTarget {
}
public dispatchEvent(event: domTypes.Event): boolean {
- if (!(event.type in this.listeners)) {
+ if (!this.listeners.hasOwnProperty(event.type)) {
return true;
}
const stack = this.listeners[event.type].slice();
diff --git a/js/event_target_test.ts b/js/event_target_test.ts
index bad3828a1..c1c9bb1f4 100644
--- a/js/event_target_test.ts
+++ b/js/event_target_test.ts
@@ -64,3 +64,26 @@ test(function removingNullEventListenerShouldSucceed() {
assertEquals(document.removeEventListener("x", null, true), undefined);
assertEquals(document.removeEventListener("x", null), undefined);
});
+
+test(function constructedEventTargetUseObjectPrototype() {
+ const target = new EventTarget();
+ const event = new Event("toString", { bubbles: true, cancelable: false });
+ let callCount = 0;
+
+ function listener(e): void {
+ assertEquals(e, event);
+ ++callCount;
+ }
+
+ target.addEventListener("toString", listener);
+
+ target.dispatchEvent(event);
+ assertEquals(callCount, 1);
+
+ target.dispatchEvent(event);
+ assertEquals(callCount, 2);
+
+ target.removeEventListener("toString", listener);
+ target.dispatchEvent(event);
+ assertEquals(callCount, 2);
+});