2014-12-24 4 views
2

В верхней части каждого скомпилированного javascript файла дротика находится этот нечетный список.Для dartjs каков нечетный список алфавитов (от А до Я) для пустых экземпляров класса?

function dart() { 
    this.x = 0; 
    delete this.x; 
} 
var A = new dart; 
var B = new dart; 
var C = new dart; 
var D = new dart; 
var E = new dart; 
var F = new dart; 
... etc etc ... 
var Z = new dart; 

Я просмотрел остальную часть кода, который ищет .A (или любые другие буквы) без везения. Какая цель это в точности? Конечным результатом является то, что экземпляры A-Z функции/конструктора dart() представляют собой пустые объекты класса, но для чего они используются?

Использования регулярных выражений, как /[A-Z]{1}\./ я нашел несколько письма экземпляров украшенных свойств, а затем все 27 букв проходят через эту функцию:

function convertToFastObject(properties) { 
    function MyClass() { 
    } 
    MyClass.prototype = properties; 
    new MyClass(); 
    return properties; 
} 
; 
A = convertToFastObject(A); 
B = convertToFastObject(B); 
C = convertToFastObject(C); 
... etc etc ... 
Z = convertToFastObject(Z); 

что еще более запутанную ад из меня. Поскольку эта строка, похоже, читается как SomeObject = convertToFastObject(SomeObject); без изменений.

Редактировать/Обновить: Обнаружено объяснение для convertToFastObject и его предшественника класса dart() - Why the convertToFastObject function make it fast? Это трюк оптимизации. Все еще оставляет мне вопрос о том, почему список экземпляров A-Z - это еще один трюк оптимизации или какая-то хэш-таблица кода?

+0

Отчасти сложный вызов: Pixel объясняет, что и Флориан объясняет, почему переменные A-Z дартса. – David

ответ

3

Эти объекты содержат все статики (глобалы, классы, ...), которые были определены в вашей программе Дарта (и не были уничтожены деревьями). Мы называем их «глобальными объектами».

Существует некоторая история здесь: изначально у нас был только один глобальный объект, который был на верхнем уровне JS. Мы не хотели (и все еще не хотим) загрязнять глобальное пространство имен JavaScript и сдерживали себя перед одним объектом. Мы не просто превратили программу в анонимную функцию, потому что это замедлило работу программы.

Вещи развивались ... Двигатели JavaScript ускорялись с вложенными областями, и мы перевели наш код в анонимную функцию. Это позволило перейти на более «верхний уровень» (завернутый в функцию) объектов. Также мы обнаружили, что JS-движки очень плохи с объектом, который содержит слишком много свойств. Как следствие, мы разбиваем один глобальный объект на более мелкие части и распределяем скомпилированную статику/классы в разные глобальные объекты. Когда классы Dart заканчиваются, он основан на предопределенной карте для внутренних библиотек и основан на их имени библиотеки для других.

Мы не просто подходим к определенному числу (например, 1000 для «A», 1000 для «B», ...), потому что это будет означать, что выход JS может значительно измениться при незначительных изменениях.

Теперь мы можем просто избавиться от этих объектов, но мы еще не видели его в этом. Двигатели JS очень хорошо подходят для оптимизации доступа к объектам. Я не тестировал его, но думаю, что использование двух функций одного и того же объекта возможно быстрее или быстрее, чем использование двух локальных переменных.

5

Классы A-Z зарезервированы для глобальных библиотек Dart. Небольшое количество из них используются для конкретных библиотек, как вы можете видеть в source:

static const reservedGlobalObjectNames = const <String>[ 
    "A", 
    "B", 
    "C", // Global object for *C*onstants. 
    "D", 
    "E", 
    "F", 
    "G", 
    "H", // Global object for internal (*H*elper) libraries. 
    // I is used for used for the Isolate function. 
    "J", // Global object for the interceptor library. 
    "K", 
    "L", 
    "M", 
    "N", 
    "O", 
    "P", // Global object for other *P*latform libraries. 
    "Q", 
    "R", 
    "S", 
    "T", 
    "U", 
    "V", 
    "W", // Global object for *W*eb libraries (dart:html). 
    "X", 
    "Y", 
    "Z", 
]; 

Все остальное, кажется, можно использовать для изолятов, как указано методом globalObjectFor и просмотра результатов dart2js скомпилированный код, который использует изоляты.

 Смежные вопросы

  • Нет связанных вопросов^_^