Skip to content

Instantly share code, notes, and snippets.

@Nilegfx
Forked from h2non/ancestors.js
Created April 2, 2016 08:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Nilegfx/33771f4b9be667ac1504cdaac2ff5346 to your computer and use it in GitHub Desktop.
Save Nilegfx/33771f4b9be667ac1504cdaac2ff5346 to your computer and use it in GitHub Desktop.
Recursively inspect the prototype chain inheritance of a given object in JavaScript (inspired in Ruby's Class.ancestors)
// Under WTFPL license ;)
function ancestors(obj) {
var hierarchy = [];
if (['boolean', 'number', 'string', 'undefined'].indexOf(typeof obj) !== -1 || obj === null) { // primitives types
obj = Object(obj);
} else if (typeof obj === 'function') {
hierarchy.push(
obj.name ||
(obj.toString().match(/function (\w*)/) ||
obj.toString().match(/\[object (\w*)\]/))[1] ||
'Anonymous Function'
);
obj = obj.prototype;
} else if (obj.toString() !== '[object Object]' && obj.prototype) { // fix Objects instances and IE issue
hierarchy.push(
obj.prototype.constructor.name ||
(obj.prototype.constructor.toString().match(/function (\w*)/) ||
obj.prototype.constructor.toString().match(/\[object (\w*)\]/))[1] ||
'Anonymous Function'
);
obj = obj.prototype;
} else if (!Object.getPrototypeOf(obj) && obj.constructor) {
hierarchy.push(
obj.constructor.name ||
(obj.constructor.toString().match(/function (\w*)/) ||
obj.constructor.toString().match(/\[object (\w*)\]/))[1] ||
'Anonymous Function'
)
}
while (obj = Object.getPrototypeOf(obj)) {
if (obj && obj.constructor) {
hierarchy.push(
obj.constructor.name ||
(obj.constructor.toString().match(/function (\w*)/) ||
obj.constructor.toString().match(/\[object (\w*)\]/))[1] ||
'Anonymous Function'
)
}
}
return hierarchy
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment