Extend Native Prototypes in Node.js

By  on  

As someone who was on the legendary MooTools JavaScript team, I have some affection for extending the prototypes of native objects.  Of course the practice of extending prototypes is taboo these days as browser vendors are iterating and implementing new specs more quickly than the IE6 era, but extending natives in Node.js could be considered safer as, in theory, we have more control over the environment (Node.js version).

Extending a native within Node.js is fairly simple:

// Inside a file module called "String.prototype.startsWith.js"
// Naming convention important for maintenance and clearness of intent

// This is a very, very simple shim not made for production use
// It's simply to illustrate the prototype extension
// More logic should be added for edge cases 
if(!String.prototype.startsWith) {
  String.prototype.startsWith = function(term) {
    return this.substr(0, term.length) === term;
  };
}

// ----------

// Inside any other module that wants to use the extension
require('String.prototype.startsWith');

// Usage
if(myString.startsWith('Moo')) {
  // ...
}

As long as you require the the module that contains the extension code, the native will have its desired additional method.  Of course this doesn't just apply to natives, you can extend other Objects in this same fashion.  If you scour npm you can find loads of prototype extensions, one being String.prototype.startsWith, which also work in client side code.

I presume I'll receive some haterade for suggesting this practice being more OK with Node.js so have at me!

Recent Features

  • By
    5 HTML5 APIs You Didn’t Know Existed

    When you say or read "HTML5", you half expect exotic dancers and unicorns to walk into the room to the tune of "I'm Sexy and I Know It."  Can you blame us though?  We watched the fundamental APIs stagnate for so long that a basic feature...

  • By
    CSS Gradients

    With CSS border-radius, I showed you how CSS can bridge the gap between design and development by adding rounded corners to elements.  CSS gradients are another step in that direction.  Now that CSS gradients are supported in Internet Explorer 8+, Firefox, Safari, and Chrome...

Incredible Demos

  • By
    prefers-color-scheme: CSS Media Query

    One device and app feature I've come to appreciate is the ability to change between light and dark modes. If you've ever done late night coding or reading, you know how amazing a dark theme can be for preventing eye strain and the headaches that result.

  • By
    CSS :target

    One interesting CSS pseudo selector is :target.  The target pseudo selector provides styling capabilities for an element whose ID matches the window location's hash.  Let's have a quick look at how the CSS target pseudo selector works! The HTML Assume there are any number of HTML elements with...

Discussion

  1. Ricardo

    In fact, I don’t see much problem extending String/Array/… objects in client side code. When the browser supports it, then the polyfill will not be used.
    About extending host objects (DOMElement…), the main problem was IE6-7. Recent browsers have no problem with it, even if that does not belong to the specification

  2. MaxArt

    Never had any problem extending native prototypes, but there are a few caveats:

    – you either polyfill standard methods (like startsWith above) or use names that won’t probably be used by future standard developments, such as vectorDotProduct;
    – don’t abuse this technique: changing prototypes is *slow* and also user-defined methods in the prototype chain are;
    – unless you make a module out of your extensions, remember that your code will be less reusable.

  3. “extending natives in Node.js” should “be considered safer as, in theory,” upgrading Node.js breaks everything :P

    Kidding, my v0.11 to v4 upgrade was actually pretty smooth.

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!