5

これは、これに対するフォローアップの質問です

次の 2 つの例を見てください。

var number1 = new Number(3.123);
number1 = number1.toFixed(2); 
alert(number1);

var number2 = 3.123;
number2 = number2.toFixed(2);
alert(number2);

どちらも同じ値になってしまうのは承知していますが、プリミティブな値のメソッドを参照するのは正しい考え方でしょうか? (つまり、object.method ではなく 3.123.method?)

4

3 に答える 3

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
于 2008-12-15T19:40:54.110 に答える
4

JavaScriptでは、関数や整数も含め、すべてがオブジェクトです。数字や文字列のメソッドを考えてもまったく問題ありません。例えば:

>>> (3.123).toString()
"3.123"
于 2008-12-15T19:41:03.890 に答える
3

リテラル値またはプリミティブ値で初期化された変数でメソッドを呼び出すと、最初に値を適切な型のオブジェクトに強制し、次にそのメソッドを呼び出すのと同じ効果があります。次の実験は、これを言葉で説明しようとするよりも優れています。

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));
于 2008-12-15T20:39:44.507 に答える