A minimal utility for creating objects with a
nullprototype 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 --saveconst 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 296,220,603 ops/sec ±5.23% (74 runs sampled)
Object.create(null) x 78,571,005 ops/sec ±1.32% (93 runs sampled)
{} (normal object) x 292,647,799 ops/sec ±4.96% (76 runs sampled)
Fastest is NullProtoObj via constructor,{} (normal object)
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