Flatten out an objects prototypes into a single flat object

Downloads in past


4.0.09 years ago10 years agoMinified + gzip package size for flatten-prototypes in KB


Flatten out an objects prototypes into a single flat object


var flattenPrototypes = require("flatten-prototypes");

var foo = { hello: 'foo', deep: { one: true } }
var bar = { woop: 'leep' }
var baz = { world: 'baz', deep: { two: true } }

foo.__proto__ = bar
bar.__proto__ = baz

var obj = flattenPrototypes(foo)
obj.hello // foo
obj.woop // leep
obj.world // baz
obj.deep // { one: true, two: true }
Object.keys(obj); // ['hello', 'woop', 'world', 'deep']


flattenPrototypes(object) => object

flattenPrototypes takes an object with a non trivial prototype
chain and will return you a plain object with no prototypes
which has all the properties of the original object and it's
This is like Object.getOwnPropertyNames except it get's all
the property names not just it's "own" ones and then returns
a new plain object with those properties where the values
are either the value of the property or a deep merging of
the values of the properties if multiple of the prototypes
have the same key.
Basically if you were using prototypes to share data across
multiple objects and you wanted to be able to get a flat plain
object of the current state you can call `flattenPrototypes`
var Blueprint = {
    hands: 2,
    feet: 2,
    legs: 2,
    arms: 2

var Spider = {
    legs: 8,
    feet: 8,
    hands: 0,
    arms: 0
Spider.__proto__ = Blueprint

var Dog = {
    arms: 0,
    feet: 4,
    legs: 4,
    hands: 0
Dog.__proto__ = Blueprint

var Shepherd = {
    fluffy: true
Shepherd.__proto__ = Dog

var Pug = {
    curledTail: true
Pug.__proto__ = Dog

var myPug = {
    name: "Puggy pug pug"
MyPug.__proto__ = Pug

// to get the properties of `MyPug` we can flatten its prototypes
var props = flattenPrototypes(myPug)
// this now is a plain object with own properties which means
// we can serialize and print it


npm install flatten-prototypes


npm test


- Raynos

MIT Licenced