В чем разница между новой вещью (парам) и новой (вещь)? - PullRequest
1 голос
/ 26 октября 2011

Я только что написал немного CoffeeScript и получил странную ошибку:

TypeError: Thing(param) is not a constructor

Но это так!И когда я попробую это в консоли:

var that = new Thing(param);
that.doesSomething();

После некоторой путаницы я просмотрел скомпилированный источник и обнаружил, что coffee компилирует that = new Thing param в that = new(Thing(param));.Weird;Я никогда не видел этого раньше.Поэтому я сразу попробую: и тада!Теперь я могу повторить:

var that = new(Thing(param));
that.previousLineErrorsOut();

(Кстати, генератор CoffeeScript на своей домашней странице создает форму new Thing(). График утолщается ...)

Я также пробую это с нативными конструкторами (new Worker("somefile") и new(Worker("somefile"))), которые ведут себя «правильно», то есть нет никакой разницы между этими двумя формами.

Так что я полностью запутался: что new()?Почему это терпит неудачу в некоторых случаях? Почему CoffeeScript превращает мои прекрасно new в new()?

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Разница между вызовами типа конструктора

new Thing(params)

и функциональный вызов

Thing(params)

означает, что в 1-м случае ключевое слово this внутри тела функции привязано к создаваемому объекту, а во 2-м случае оно связано с глобальным объектом (окном в браузере)

new(Thing(params))

- действительно странная форма, и в этой форме Thing сначала вызывается как функция, затем ее результат проверяется против слова new как конструктора без параметров.

Крайне странно, что ваша CS компилирует это так.

Я попробовал его на официальном сайте (http://jashkenas.github.com/coffee-script/, вкладка Try Coffeescript), и он компилируется

that = new Thing param

до

var that;
that = new Thing(param);
1 голос
/ 26 октября 2011

new принимает выражение, представляющее конструктор и, необязательно, список аргументов, заключенный в скобки. Например:

new Thing;   // equivalent to next line
new Thing(); // most common form
new (function() {})(); // calls the anonymous function as a
                       // constructor with no arguments
new (function() {});   // equivalent to previous; if no arguments are
                       // specified to new, it will call with no arguments

Когда вы делаете это:

new(Thing(param));

Он пытается запустить результат вызова Thing с аргументом param в качестве конструктора без аргументов. Скобки после new делают Thing(param) выражением, представляющим конструктор. Поскольку Thing не возвращает конструктор в вашем случае, он завершается ошибкой. Это примерно эквивалентно этому:

var clazz = Thing(param);
var instance = new clazz();

Я не знаю, почему CoffeeScript преобразует его таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...