2

これらのコードがデータ型をチェックできる理由について、誰かが少し説明できますか? 彼らは私には意味がありません。コードが舞台裏で何をしているのか理解できません。前もって感謝します!

var toClass = {}.toString // {} is for what? toString is a method?

alert(toClass); // alert it I get a function? = > function toString() {[native code]}

alert( toClass.call( [1,2] ) )  
alert( toClass.call( new Date ) ) 
4

2 に答える 2

5
var toClass = {}.toString;

と同等です

var toClass = Object.prototype.toString;

なぜなら

{}

式としてObject初期化子)は次と同等です

new Object()

ここで、Objectは「その名前の標準組み込みコンストラクター」です ( ECMAScript 言語仕様、5.1 版、セクション 11.1.5およびそれ以前の版)。

So{}は、新しいObjectインスタンスへの参照を表します。 デフォルトでは、インスタンスは、組み込みプロパティを含む、プロトタイプ チェーン (セクション 15.2.5Object ) を介して によって最初に参照されたオブジェクトからプロパティを継承します。プロパティ値は、最初はインスタンスへの参照です。つまり、プロパティは呼び出すことができるメソッドです (セクション 15.2.4.2 )。Object.prototypeObject.prototype.toStringFunction

alertですwindow.alert(そう書かれるべきです)。 windowECMAScript グローバル オブジェクトのプロパティです。そのプロパティによって参照されるオブジェクトは、alertメソッドを持つスコープ チェーン内のホスト オブジェクトです。どちらも ECMAScript で指定されていませんが、仕様 (セクション 15.1 ) で許可されているように、一部のホスト環境(通常はブラウザー) によって提供されます。

alertホスト メソッドは警告メッセージを表示するように設計されているため、最初の引数の文字列表現を表示します。toStringオブジェクトの場合は、最初にサポートされているメソッドまたはvalueOfメソッドの呼び出しが含まれます(セクション 9.8 )。Functionによって参照されるようなインスタンスは、関数の実装依存の表現を返すメソッドを{}.toString継承します (セクション 15.3.4.2 )。toString

ただし、クラスはなく、ECMAScript の概念は[[Class]]「データ型」の概念とは多少異なります (typeofおよびを参照instanceof)。これらは、プロトタイプベースの継承を使用する言語です (セクション 4.2.1 )。

于 2013-02-27T09:07:17.517 に答える
1

これは次と同等です。

Object.prototype.toString.call([1, 2]);
Object.prototype.toString.call(new Date);

これは、すべてのオブジェクトがデフォルトで継承するObject.prototype.toStringデフォルトのメソッドです。toString呼び出されると、次のように出力されます。

[object XXX]

{}.toString{}はの略であるため、ここでも同様ですnew Object()

派生オブジェクトはtoString、ニーズに合わせてメソッドを自由にオーバーライドできます。次に例を示します。

> [1, 2].toString()
"1,2"

> (new Date).toString()
"Wed Feb 27 2013 17:03:42 GMT+0800 (Malay Peninsula Standard Time)"

.call()ただし、 onObject.prototype.toStringまたはを使用して「プリミティブ」メソッドを使用することもできます。これにより、呼び出しているメソッド内で参照するものを定義するため{}.toStringに最初のパラメーターが使用されます。.call()this

于 2013-02-27T09:01:57.987 に答える