Before going in to the details of the issue I'm already fully aware of modifying built in's prototypes. This code is written in typescript.

Ok so I'm running in to an issue when I'm trying to return a number's value from a method on Number.prototype.

Here is the definition on Number.prototype:

```
Object.defineProperty(Number.prototype, 'tap', {
  value: function numberTap (fn: (t: number) => void): number {
    fn.call(null, this.valueOf());
    return this.valueOf();
  }
});

```

and the test I'm running:

```
describe('Number.prototype.tap((value:number) => void): number', () => {
  it('is defined', function () {
    expect(Number.prototype.tap).to.be.a('function');
  });

  it('returns the same value as its entry point in the method chain', () => {
    expect((1).tap(n => 5)).to.equal(1);
  });
});

```

It doesn't equal `1` but `[Number 1]`. If I call `[Number 1].valueOf()` then it returns `1`. I'm already calling `this.valueOf()` when returning from tap. Anyone know what's going on here.