Skip to content

Instantly share code, notes, and snippets.

@alexsasharegan
Created July 22, 2017 19:02
Show Gist options
  • Select an option

  • Save alexsasharegan/e6f159d05313bde5ae64953431fae3ed to your computer and use it in GitHub Desktop.

Select an option

Save alexsasharegan/e6f159d05313bde5ae64953431fae3ed to your computer and use it in GitHub Desktop.
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