1

私はjavascriptプロトタイプについて読んでいて、Numberクラスを拡張してオブジェクトのタイプを示す関数を追加する次のコードに出くわしました

Number.prototype.toString = function() {
    return typeof (this);
}
(123).toString(); //prints "object"

valueOfそして、関数を使用してプリミティブ表現を取得できることを読みました

 n = new Number(123);
 typeof n.valueOf() // prints "number"

だから私は toString 関数でプリミティブ表現を取得しようとしました

Number.prototype.toString = function() {
    return typeof (this.valueOf());
}
(123).toString(); //prints "object"

"number" を返すことを期待していましたが、 "object" を出力しました。それは予想される動作ですか、それとも間に何かが欠けていますか?

更新: Firebug と chrome コンソールは「オブジェクト」を出力し、アラートは両方のケースで番号を表示します UPDATE2: 間違いでした。console.log ((123).toString()) 出力番号

4

3 に答える 3

2

「数字」以外のものを印刷することはできません。数値から具体的に作成しObjectても数値になります。

getType既存のtoStringメソッドとの競合を避けるためにメソッドに名前を付けました。ただし、使用しても同じ結果が得られtoStringます。)

Number.prototype.getType = function() {
    return typeof this.valueOf();
}
console.log((123).getType()); // prints "number"

var n = 123;
console.log(n.getType()); // prints "number"

var o = new Number(123);
console.log(o.getType()); // prints "number"

var x = new Object(123);
console.log(x.getType()); // prints "number"

これを IE (10、9、8、7)、Firefox、および Chrome でテストしたところ、同じ結果が得られました。

テスト: http://jsfiddle.net/Guffa/Xc7TC/

于 2013-04-03T06:59:01.537 に答える
1

これは次のように分類できます。

// Case 1
typeof (Number(123));        // "number"

// Case 2
typeof (new Number(123));     // "object"

質問はなぜですか?

ケース 1:これは、Number(123)が引数123の値を type の値に変換する関数呼び出しであるためですNumber

ケース 2: 引数値を使用してオブジェクトnew Number(123)を作成します。これは;のためにコンストラクタを直接呼び出しています。したがって、最後に型を取得します。Number Number newobject

于 2013-04-03T07:01:45.643 に答える