Search code examples
javascriptdefineproperty

JS: how to define properties on numeric variables


I've few variables that are of type number (or for that matter strings too). I want add some metadata to these variables.

When I try to use Object.defineProperty(myvar, "prop", {/*getter & setter*/}) it gives an error that myvar is not an object.

How can I define a property on non-objects with getter and setter methods?

I don't want to add anything to Number.prototype because I want these properties only on few variables.


Solution

  • You can do this by prototypal inheritance. Using Number.prototype like this:

    var proto = Object.create(Number.prototype);
    function MyNumber() {
    }
    MyNumber.prototype = proto;
    MyNumber.prototype.constructor = MyNumber;
    MyNumber.prototype.someOwnMethod = function () {
    }
    // and so on
    var myVar = new MyNumber();
    Object.defineProperty(myvar, "prop", {/*getter & setter*/});
    

    You'll get an Object in prototypes along with methods of Number.

    Or if you do not need any own methods, just use Number constructor instead of number literal.

    var myVar = new Number();
    Object.defineProperty(myvar, "prop", {/*getter & setter*/});
    

    The same for strings:

        var myVar = new String();