Вопрос по javascript – Всегда ли конструктор является функциональным объектом?

6

Я читаю последний справочник ECMA-262, выпуск 5.1, июнь 2011 г.

В разделе8.6.2 Таблица 9 мы имеем в отношении внутреннего свойства [[Construct]]:

Creates an object. Invoked via the new operator. The arguments to the SpecOp are the arguments passed to the new operator. Objects that implement this internal method are called constructors.

Стандарт не говорит, что конструктор должен быть объектом Function. Так может ли у нас быть объект конструктора, который не является функциональным объектом?

Ссылка на стандарт по запросу

Вы могли бы быть заинтересованы вAnnotated ES5 который является преобразованием HTML стандарта ECMA-262 5.1 в формате PDF. У этого есть якоря секции, такие как тот дляSection 8.6.2. Dan D.
Выactually читать спецификации ... Браво. Derek 朕會功夫
если я правильно помню, Крокфорд сказал, что в целом использование конструктора в JS не очень хорошая модель thepoosh
@Thepoosh Крокфорд также утверждает, что оператор ++ не является хорошим шаблоном в JS ... Piotr Kochański
Не могли бы вы дать ссылку на документ спецификации? Я не думаю, что многие люди смогут ответить без более полного контекста за предоставленную вами цитату. (Интересный вопрос, хотя!) apsillers

Ваш Ответ

3   ответа
3

указал), ничто не мешает не «конструктору» объект от наличия[[Construct]] метод.

Это немного сбивает с толку. Это означает, что вы можете использоватьnew оператор на объекте, который не являетсяFunction (таким образом, не «конструктор» согласно4.3.4 ), но действительно обеспечивает[[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 возвращается"function" даже еслиjava.lang.String это не функция. Это правильно в соответствии с11.4.3 (это хост-объект с[[Call]] метод)

Error: User Rate Limit ExceededHost objects **may** support these internal properties with **any implementation-dependent behaviour**...Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded8.6.2Error: User Rate Limit Exceeded4.3.24
Error: User Rate Limit Exceeded Roland
Error: User Rate Limit Exceeded
0

ответ (это было бы слишком долго для комментария).

Путаница увеличивается13.2.2 в соответствии с которым, когдаfunction's construct выполняется егоcall операция должна быть выполнена (но она не говорит, что должно быть сделано, когдаconstruct объекта, который не является функцией, выполняется). Теперь объекты, которые реализуютcall могут быть вызваныfunction объекты в соответствии с9.11.

Также в соответствии с4.2 «функция является вызываемым объектом». Но, конечно, это не означает, что каждый вызываемый объект является функцией.

Так что, если я понял это правильно, не объекты Function могут иметьConstruct метод, а такжеCall метод.java.lang.String был бы один такой пример.

4

ES5 & # xA7; 4.3.4 говорит:

Constructor Function object that creates and initialises objects.

Итак, у вас это есть, по определению, только функция может быть конструктором. Однако, вероятно, существуют хост-объекты, которые ведут себя как конструкторы, у которых нет других атрибутов нативных объектов Function (например, оригинальный объект XMLHttpRequest в IE, который был реализован в ActiveX).

Error: User Rate Limit Exceeded Roland

Похожие вопросы