Я просматривал исходный код движка шаблонов Jade и пытаюсь понять, что означает это утверждение.

Я понял, что он попытается создать экземпляр options.compiler, а если это не удастся, создать экземпляр Compiler, но следующая часть смущает меня ... Является ли это высказывание для вызова parser.parse и объявления возвращаемого значения как Переменная? Если так, то почему самый правильный вариант?

var compiler = new (options.compiler || Compiler)(parser.parse(), options)
  , js = compiler.compile();

.
Вот еще немного контекста, если это поможет

function parse(str, options){
  try {
    // Parse
    var parser = new Parser(str, options.filename, options);

    // Compile
    var compiler = new (options.compiler || Compiler)(parser.parse(), options)
      , js = compiler.compile();

Github - линия 960

0
SkinnyG33k 25 Янв 2013 в 09:11

3 ответа

Лучший ответ

Давайте разберемся с этим.

(options.compiler || Compiler)

Это выражение, похоже, предназначено для поиска «класса» (ну, технически это функция конструктора, это JavaScript). Объект параметров может быть использован для его указания, иначе он будет прибегать к тому, на что ссылается Compiler.

new (options.compiler || Compiler)(/* ... */)

Хорошо, теперь это имеет больше смысла. Мы вызываем конструктор. Просто «класс» был выбран динамически.

new (options.compiler || Compiler)(parser.parse(), options)

Когда мы получаем доход от конструктора, мы передаем два параметра. Первый - это результат вызова метода parse объекта parser, а второй - объект параметров из предыдущего.

var compiler = new (options.compiler || Compiler)(parser.parse(), options)

Этот нечестивый беспорядок хранится в переменной compiler.

var compiler = new (options.compiler || Compiler)(parser.parse(), options), js = compiler.compile();

Вы можете объявить и назначить несколько переменных в одном и том же выражении var, что еще больше запутает ситуацию. Но последняя часть довольно проста для понимания сама по себе.

Это утверждение может и, вероятно, должно быть разбито на несколько строк ... но оно так и есть.

1
Platinum Azure 25 Янв 2013 в 05:24

var compiler = new (options.compiler || Compiler) не пытается создать экземпляр options.compiler. Он ищет существование конструктора compiler как свойство option. Если он не находит его, он использует Compiler в качестве конструктора.

Затем он просто передает эти 2 аргумента используемому конструктору: первый аргумент - это возвращаемое значение parser.parse(), а второй аргумент - options.


Чтобы упростить это, это можно переписать следующим образом:

var theConstructor = options.compiler || Compiler;
var parsedStuff = parser.parse();
var compiler = new theConstructor(parsedStuff, options);
2
Joseph Silber 25 Янв 2013 в 05:22

Это выглядит забавно, потому что вызываемый конструктор сам является выражением.

И нет, он не совсем вычисляет parser.parse() как значение объявленного локального compiler,, а скорее создает новый объект из возвращенного и инициализирует {{X2} } От этого.

И это самое правое происхождение просто потому, что код знает, что какой бы конструктор не был возвращен ... ему понадобятся два параметра.

0
DigitalRoss 25 Янв 2013 в 05:15