Вызов метода для литерального значения или переменной, инициализированной примитивным значением, имеет тот же эффект, что и сначала приведение значения к объекту соответствующего типа, а затем вызов метода для него. Следующий эксперимент лучше, чем пытаться объяснить это словами:
Object.prototype.getPrototype = function() { return "Object"; };
Number.prototype.getPrototype = function() { return "Number"; };
function test(v) {
alert("proto: " + v.getPrototype()
+ ", type: " + typeof v
+ ", is a Number: " + (v instanceof Number)
+ ", is an Object: " + (v instanceof Object));
}
// proto: Number, type: number, is a Number: false, is an Object: false
test(42);
// proto: Number, type: number, is a Number: false, is an Object: false
test(Number(42));
// proto: Number, type: object, is a Number: true, is an Object: true
test(Object(42));
// proto: Number, type: object, is a Number: true, is an Object: true
test(new Number(42));