# flatten-prototypes

> Flatten out an objects prototypes into a single flat object

Latest version **4.0.0** (published 2015-07-30) · 0 weekly downloads

## Install

```sh
npm install flatten-prototypes
pnpm add flatten-prototypes
yarn add flatten-prototypes
bun add flatten-prototypes
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 4.0.0 |
| Published | 2015-07-30 |
| First published | 2014-01-09 |
| Weekly downloads | 0 |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 2 |
| Known vulnerabilities | 0 (+1 in 1 direct dependencies) |
| Install scripts | no |
| Author | Raynos |
| Maintainers | raynos, uber, mattesch |

## Links

- npm: https://www.npmjs.com/package/flatten-prototypes
- Repository: https://github.com/uber/flatten-prototypes
- Issues: https://github.com/uber/flatten-prototypes/issues
- npm.io page: https://npm.io/package/flatten-prototypes

## Dependencies (2)

- [deep-merge](https://npm.io/package/deep-merge.md) ^1.0.0
- [deep-extend](https://npm.io/package/deep-extend.md) ^0.4.0

## Recent versions

- 4.0.0 (latest) — 2015-07-30
- 3.0.0 — 2014-09-23
- 2.0.1 — 2014-01-09

## README

# flatten-prototypes

Flatten out an objects prototypes into a single flat object

## Example

```js
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']
```

## Docs

### `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
    prototypes.

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`

```js
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
console.log(JSON.stringify(props))
```

## Installation

`npm install flatten-prototypes`

## Tests

`npm test`

## Contributors

 - Raynos

## MIT Licenced

---
_Source: https://npm.io/package/flatten-prototypes · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
