A minimal utility for creating objects with a
null
prototype using a reusable constructor.
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.
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)
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
Feature | Object.create(null) |
new NullProtoObj() |
---|---|---|
Shared prototype | ❌ | ✅ |
Hidden class reuse | ❌ | ✅ |
Inline caching | ❌ | ✅ |
JIT-friendly | ❌ | ✅ |
Memory efficient | ❌ | ✅ |
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.
$ npm install null-prototype-object --save
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)
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
null-prototype-object © Kiko Beats, released under the MIT License.
Credits to pi0 and anonrig. Maintained by Kiko Beats with help from contributors.
kikobeats.com · GitHub Kiko Beats · Twitter @kikobeats