diff --git a/src/add.js b/src/add.js index 01956d3..06af372 100644 --- a/src/add.js +++ b/src/add.js @@ -1,6 +1,10 @@ -import { handlers, defaultHandler } from './handlers.js' +import { handlers, withDefaultHandler } from './handlers.js' -export let add = (...classes) => addCustom(...classes, defaultHandler) +export let add = (...classes) => { + for (let Class of classes) { + withDefaultHandler.add(Class.prototype) + } +} export let addCustom = (...classes) => { let handler = classes.pop() diff --git a/src/handlers.js b/src/handlers.js index 8be5487..f11155d 100644 --- a/src/handlers.js +++ b/src/handlers.js @@ -1,30 +1,10 @@ -import { compareSymbols } from './compareSymbols.js' - export let handlers = new Map() +export let withDefaultHandler = new Set([Array.prototype, Object.prototype, null]) -let OBJECT_START = {} -let OBJECT_END = {} let REGEXP = {} let DATE = {} let BUFFER = {} -export let defaultHandler = (obj, push, recurse) => { - push(OBJECT_START, Object.getPrototypeOf(obj)) - for (let property of Object.getOwnPropertyNames(obj) - .sort() - .concat(Object.getOwnPropertySymbols(obj).sort(compareSymbols))) { - push(property) - recurse(obj[property]) - } - push(OBJECT_END) -} - -handlers.set(Array.prototype, defaultHandler) - -handlers.set(Object.prototype, defaultHandler) - -handlers.set(null, defaultHandler) - handlers.set(RegExp.prototype, (obj, push) => push(REGEXP, obj.toString())) handlers.set(Date.prototype, (obj, push) => push(DATE, obj.getTime())) diff --git a/src/keys.js b/src/keys.js index 50343b6..0191bc1 100644 --- a/src/keys.js +++ b/src/keys.js @@ -1,11 +1,27 @@ -import { handlers } from './handlers.js' +import { handlers, withDefaultHandler } from './handlers.js' +import { compareSymbols } from './compareSymbols.js' + +let OBJECT_START = {} +let OBJECT_END = {} let array = [] let push = array.push.bind(array) let recurse = obj => { if (typeof obj === 'object' && obj !== null) { - let handler = handlers.get(Object.getPrototypeOf(obj)) + let prototype = Object.getPrototypeOf(obj) + if (withDefaultHandler.has(prototype)) { + push(OBJECT_START, prototype) + for (let property of Object.getOwnPropertyNames(obj) + .sort() + .concat(Object.getOwnPropertySymbols(obj).sort(compareSymbols))) { + push(property) + recurse(obj[property]) + } + push(OBJECT_END) + return + } + let handler = handlers.get(prototype) if (handler) { handler(obj, push, recurse) return