Created
July 22, 2017 19:02
-
-
Save alexsasharegan/e6f159d05313bde5ae64953431fae3ed to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| const { assign, defineProperty, defineProperties } = Object; | |
| function readonlyDescriptor() { | |
| return { configurable: false, writable: false } | |
| } | |
| export class SyntheticEvent { | |
| constructor(type, eventInit = {}) { | |
| // Start by emulating native Event constructor. | |
| if (!type) { | |
| throw new TypeError( | |
| `Failed to construct '${this.constructor.name}'. 1 argument required, ${arguments.length} given.` | |
| ); | |
| } | |
| // Assign defaults first, | |
| // the eventInit, | |
| // and last the type and timestamp so they can't be overwritten. | |
| assign(this, SyntheticEvent.defaults(), eventInit, { type, timeStamp: new Date().getTime() }); | |
| // Freeze some props as readonly. | |
| defineProperties(this, { | |
| type: readonlyDescriptor(), | |
| // Conform to native Event's name | |
| timeStamp: readonlyDescriptor(), | |
| // Alias for misspelling | |
| timestamp: { | |
| enumerable: true, | |
| get() { | |
| return this.timeStamp; | |
| } | |
| }, | |
| cancelable: readonlyDescriptor(), | |
| nativeEvent: readonlyDescriptor(), | |
| target: readonlyDescriptor(), | |
| vueTarget: readonlyDescriptor() | |
| }); | |
| // Create a private variable using closure scoping. | |
| let defaultPrevented = false; | |
| // Recreate event method | |
| this.preventDefault = function preventDefault() { | |
| defaultPrevented = true; | |
| }; | |
| // Alias preventDefault | |
| this.cancel = this.preventDefault; | |
| // Create a publicly accessible prop that can only be altered by preventDefault | |
| defineProperty(this, "defaultPrevented", { | |
| enumerable: true, | |
| get() { | |
| return defaultPrevented; | |
| } | |
| }); | |
| } | |
| static defaults() { | |
| return { | |
| type: "", | |
| timeStamp: 0, | |
| cancelable: true, | |
| nativeEvent: null, | |
| target: null, | |
| vueTarget: null | |
| }; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment