2016-09-15 2 views
1

私は非常に興味があります。正規表現には、オブジェクト "クラス"に関連するダブルプロトタイプチェーンがあります。なぜJavascriptではRegExpにdoubleオブジェクトプロトタイプがあります

//object Object --> Object --> Null 
var regex = (/checking\sprototypes/gmi); 
console.log(toString.call(regex.__proto__.__proto__.__proto__)); 

なぜこれが起こりますか?

私が印刷するときregex.__proto__ "Object prototype"の代わりにRegExpプロトタイプがあります。私がregex.__proto__.__proto__を印刷した場合、私は "Object prototype"も取得します。

チェックJavaScriptでhttp://codepen.io/gpincheiraa/pen/pEydja

+0

'Object.prototype'ではなく、' RegExp.prototype'を継承しているからですか?配列インスタンス '[] 'またはいくつかの' new ArbitraryCustomConstructor() 'は同じ長さbtwのプロトタイプチェーンを持ちます。 – Bergi

+0

Btw、 '__proto__'は廃止予定です。代わりに' Object.getPrototypeOf'を使うべきです。 – Bergi

答えて

1

継承がクラス上に構築されていない多くの例については、このcodepenが、プロトタイプに。オブジェクトプロトタイプは、これらのプロトタイプに基づいて他のオブジェクトが利用できるプロパティとメソッドを公開し、階層内で連鎖させることができます。

ここで観察することができますどのような
regex.__proto__;     // RegExp prototype 
regex.__proto__.__proto__   // Object prototype 
regex.__proto__.__proto__.__proto__ // null 

は正規表現がexectestのような正規表現の特定のメソッドを公開、RegExpプロトタイプで試作品を、持っていることです。 RegExpのプロトタイプは、hasOwnProperty__proto__ゲッターそのもののような(ほぼ)すべてのオブジェクトに共通のメソッドとプロパティを公開するObjectプロトタイプに基づいています。 Objectプロトタイプは階層の先頭であり、プロトタイプはありません(null)。

+0

JSのクラスは「非現実的」なのですか? :-P – Bergi

+0

あなたは「正規表現にはプロトタイプがあり、これはRegExpプロトタイプを持っているということがここからわかる」と言っています: 'regex .__ proto__'を印刷すると、RegExpプロトタイプの代わりに「Object prototype」が得られます。 'regex .__ proto __.__ proto__'を印刷すると、" Object prototype "も得られます。これをhttp://codepen.io/gpincheiraa/pen/pEydja?editors=0010にチェックしてください。私の質問は** regexpがObjectプロトタイプへの二重チェーンを持っている理由ですか?** –

+0

@GonzaloPincheiraArancibia 'console.log(regex .__ proto __。constructor.name)を実行すると' RegExp'が表示されます。また、 'regex .__ proto__ === RegExp.prototype'は' true'と評価されます。 –

関連する問題