这是this one的后续问题。
看看这两个例子:
var number1 = new Number(3.123);
number1 = number1.toFixed(2);
alert(number1);
var number2 = 3.123;
number2 = number2.toFixed(2);
alert(number2);
我意识到他们最终都得到了相同的值,但是参考原始值的方法是否正确? (换句话说,3.123.method而不是object.method?)
答案 0 :(得分:7)
从技术上讲,没有。您可以将其视为主要值的方法,因为number2将转换为Number
对象,然后在该对象上调用toFixed
。
当你在字符串上调用方法时会发生同样的事情。
为了说明发生了什么,您可以运行以下代码:
Object.prototype.type = function() { return typeof this; }
var string = "a string";
var number = 42;
alert(typeof string); // string
alert(string.type()); // object
alert(typeof number); // number
alert(number.type()); // object
答案 1 :(得分:3)
在JavaScript中,一切都是对象,甚至是函数和整数。考虑数字和字符串的方法是完全可以的。例如:
>>> (3.123).toString()
"3.123"
答案 2 :(得分:3)
对使用原始值初始化的文字值或变量调用方法与首先将值强制转换为适当类型的Object然后在其上调用方法具有相同的效果。以下实验比尝试用文字解释这个更好:
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));