# null-prototype-object

> Fastest way for creating null-prototype objects in JavaScript

Latest version **1.2.7** (published 2026-04-14) · MIT license · 0 weekly downloads

## Install

```sh
npm install null-prototype-object
pnpm add null-prototype-object
yarn add null-prototype-object
bun add null-prototype-object
```

## Health

**Score 65/100 (B)** — status: active.

Positive: has types; esm support; no vulnerabilities; high maintenance score; high quality score.

Warnings: low downloads.

## Facts

| | |
|---|---|
| Version | 1.2.7 |
| Published | 2026-04-14 |
| First published | 2025-05-19 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Node | >= 20 |
| Dependencies | 0 |
| Unpacked size | 7.4 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 25 |
| Author | Kiko Beats |
| Maintainers | kikobeats |
| Keywords | dictionary, fast, no-prototype, null-prototype, object, prototype, secure, utility |

## Links

- npm: https://www.npmjs.com/package/null-prototype-object
- Repository: https://github.com/kikobeats/null-prototype-object
- Issues: https://github.com/kikobeats/null-prototype-object/issues
- npm.io page: https://npm.io/package/null-prototype-object

## Alternatives

- [babylon](https://npm.io/package/babylon.md) — 5.1M weekly downloads
- [csscolorparser](https://npm.io/package/csscolorparser.md) — 3.7M weekly downloads
- [expr-eval-fork](https://npm.io/package/expr-eval-fork.md) — 1.5M weekly downloads
- [@leeoniya/ufuzzy](https://npm.io/package/@leeoniya/ufuzzy.md) — 247.7K weekly downloads
- [xml-parser](https://npm.io/package/xml-parser.md) — 78.4K weekly downloads

## Recent versions

- 1.2.7 (latest) — 2026-04-14
- 1.2.6 — 2026-03-17
- 1.2.5 — 2025-11-21
- 1.2.4 — 2025-10-14
- 1.2.3 — 2025-09-05
- 1.2.2 — 2025-08-13
- 1.2.1 — 2025-07-30
- 1.2.0 — 2025-05-22
- 1.0.0 — 2025-05-19
- 0.0.0 — 2025-05-19

## README

# null-prototype-object

> A minimal utility for creating **objects with a `null` prototype** using a **reusable constructor**.

![Last version](https://img.shields.io/github/tag/Kikobeats/null-prototype-object.svg?style=flat-square)
[![Coverage Status](https://img.shields.io/coveralls/Kikobeats/null-prototype-object.svg?style=flat-square)](https://coveralls.io/github/Kikobeats/null-prototype-object)
[![NPM Status](https://img.shields.io/npm/dm/null-prototype-object.svg?style=flat-square)](https://www.npmjs.org/package/null-prototype-object)

## Why not just `Object.create(null)`

`Object.create(null)` gives you a clean object with no prototype — useful for:

- Safe key-value maps
- Avoiding inherited methods (`toString`, `hasOwnProperty`, etc.)
- Preventing prototype pollution

But there's a performance cost in high-frequency scenarios.

### The problem

Each call to `Object.create(null)` creates a **new object shape** (hidden class).

JavaScript engines like V8 can't optimize repeated use because:

- The prototype isn't shared
- Shapes can't be reused
- Inline caching and JIT optimizations break down
- It leads to **megamorphic** call sites (a de-optimization trigger)

### The solution: `null-prototype-object`

This package provides a constructor with a **frozen, shared null-prototype**, enabling V8 to:

- Reuse a stable hidden class
- Inline property access
- Optimize memory layout
- Avoid dynamic shape transitions

### Why it’s faster

| Feature                   | `Object.create(null)` | `new NullProtoObj()` |
|---------------------------|------------------------|------------------------|
| Shared prototype          | ❌                     | ✅                     |
| Hidden class reuse        | ❌                     | ✅                     |
| Inline caching            | ❌                     | ✅                     |
| JIT-friendly              | ❌                     | ✅                     |
| Memory efficient          | ❌                     | ✅                     |

### When to use it

Use `null-prototype-object` if:

- You're allocating many null-prototype objects (e.g. parsers, serializers, caches).
- You want predictable performance in tight loops.
- You're optimizing object creation in hot code paths.

## Install

```bash
$ npm install null-prototype-object --save
```

## Usage

```js
const NullProtoObj = require('null-prototype-object')

const obj = new NullProtoObj()

// No inherited methods
console.log(obj.toString) // undefined

// Safe for dictionary-style use
obj.__proto__ = 'polluted? nope'
console.log(obj.__proto__) // => "polluted? nope"

console.log(obj.foo)
obj.foo = 'bar'
console.log(Object.getPrototypeOf(obj)) // ==> null (via prototype chain)
```

## Benchmark

```
NullProtoObj via constructor x 207,586,282 ops/sec ±4.80% (81 runs sampled)
Object.create(null) x 54,415,324 ops/sec ±2.01% (89 runs sampled)
{} (normal object) x 194,340,713 ops/sec ±5.15% (77 runs sampled)
{__proto__:null} x 39,313,923 ops/sec ±2.37% (92 runs sampled)

Fastest is NullProtoObj via constructor
```

## License

**null-prototype-object** © [Kiko Beats](https://kikobeats.com), released under the [MIT](https://github.com/kikobeats/null-prototype-object/blob/master/LICENSE.md) License.

Credits to [pi0](https://github.com/h3js/rou3/blame/main/src/_utils.ts) and [anonrig](https://github.com/anonrig/fast-querystring/blame/main/lib/parse.js#L6). Maintained by [Kiko Beats](https://kikobeats.com) with help from [contributors](https://github.com/kikobeats/null-prototype-object/contributors).

> [kikobeats.com](https://kikobeats.com) · GitHub [Kiko Beats](https://github.com/kikobeats) · Twitter [@kikobeats](https://twitter.com/kikobeats)

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