devoutsalsa
devoutsalsa

Reputation: 1200

In JavaScript, is there a way to inherit from the Number function?

So I know I can do this...

Number.prototype.square = function () { return this * this }
 [Function]
4..square()
 16

Is there a way to inherit from the Number function so that I don't have to modify the Number prototype? With a function or object, I can inherit like this...

var NewObject = new Object()
var NewFunction = new Function()

Is there a was to do something similar w/ Number?

Upvotes: 1

Views: 143

Answers (2)

cocco
cocco

Reputation: 16706

using Object.defineProperty allows you to have a little more control over the object.

Object.defineProperty(Number.prototype,'square',{value:function(){
 return this*this
},writable:false,enumerable:false});
//(5).square();

with your own lib it's the same...

Object.defineProperty(NumLib.prototype,'square',{value:function(){
 return this.whatever*this.whatever
},writable:false,enumerable:false});

Upvotes: 1

Bergi
Bergi

Reputation: 664970

Yes, you can easily inherit from the Number.prototype. The trick is to make your objects convertible to numbers by giving them a .valueOf method:

function NumLib(n) {
    if (!(this instanceof NumLib)) return new NumLib(n);
    this.valueOf = function() {
        return n;
    }
}
NumLib.prototype = Object.create(Number.prototype);
NumLib.prototype.square = function () { return this * this }

The cast will happen whenever a mathematical operation is applied to the object, see also this answer. The native Number methods don't really like to be called on derived objects, though.

Upvotes: 3

Related Questions