6

私は最新のECMA-262リファレンス、エディション5.12011年6月を読んでいます。

セクション8.6.2の表9には、[[Construct]]内部プロパティに関するものがあります。

オブジェクトを作成します。新しい演算子を介して呼び出されます。SpecOpの引数は、new演算子に渡される引数です。この内部メソッドを実装するオブジェクトは、コンストラクターと呼ばれます。

標準では、コンストラクターはFunctionオブジェクトでなければならないとは言われていません。では、関数オブジェクトではないコンストラクターオブジェクトを作成できますか?

要求に応じて標準にリンクする

4

3 に答える 3

4

答えは非常に簡単です。ES5§4.3.4によると:

Constructor Function object that creates and initialises objects.

これで、定義上、コンストラクターになることができるのは関数だけです。ただし、ネイティブFunctionオブジェクトの他の属性を持たないコンストラクターのように動作するホストオブジェクトが存在する可能性があります(たとえば、ActiveXで実装されたIEの元のXMLHttpRequestオブジェクト)。

于 2012-05-01T06:58:47.207 に答える
3

「コンストラクター」という用語は(@RobGが指摘したように)定義されていますが、「コンストラクター」以外のオブジェクトがメソッドを持つことを妨げるものは何もありません[[Construct]]

これは少し紛らわしいです。これは、( 4.3.4の「コンストラクター」ではない)オブジェクトではなく、 実際にメソッドを提供するnewオブジェクトで演算子を使用できることを意味します。Function[[Construct]]

標準オブジェクトはどれもその資格がありませんが、ホストオブジェクトは確かにそうかもしれないことに注意してください。Javaなどのブラウザプラグインは、次のようなオブジェクトを公開する可能性があります。

new java.lang.String(); // it works, so java.lang.String has a [[Construct]] method
java.lang.String instanceof Function // false
Object.prototype.toString.call(java.lang.String).indexOf('Function') // -1

関数ではありませんが、がtypeof java.lang.String返されることに注意してください。これは11.4.3によると正しいです(これはメソッドを持つホストオブジェクトです)"function"java.lang.String[[Call]]

于 2012-05-01T09:05:00.727 に答える
0

Pumbaa80の回答に追加するには(これはコメントには長すぎます)。

混乱は13.2.2増加し、それに応じて関数の construct実行時にその操作を実行する必要があります(ただし、関数ではないオブジェクトのcall実行時に何を実行する必要があるかは示されていません)。construct現在、実装するオブジェクトは、 9.11に従ってcall呼び出し可能な関数オブジェクトです。

また、4.2によると、「関数は呼び出し可能なオブジェクトです」。しかしもちろん、これはすべての呼び出し可能なオブジェクトが関数であることを意味するものではありません。

したがって、これが正しければ、非関数オブジェクトはConstructメソッドとメソッドを持つことができますCalljava.lang.Stringそのような例の1つです。

于 2012-05-01T20:38:28.603 に答える