Как использовать преимущества наследования прототипов без необходимости включать файлы в определенном порядке? - PullRequest
2 голосов
/ 11 ноября 2008

При разработке JavaScript я обычно разделяю код JavaScript на разные файлы, а затем запускаю сценарий для объединения файлов и сжатия или упаковки полученного файла. В конце концов, у меня есть один файл, который мне нужно включить на мой рабочий сайт.

Этот подход обычно работал, но у меня начались проблемы с наследованием прототипов. В частности, если один класс наследует от другого класса, файл для родительского класса должен быть уже включен, чтобы наследование работало. Если используемый мной сценарий конкатенации просто объединяет каталог, полный файлов, дочерний класс может появиться в коде перед родительским классом. Как это:

parent_class.js

var Namespace = Namespace || {};    

Namespace.Parent = function () { };
Namespace.Parent.prototype.doStuff = function () { ... };

child_class.js

var NameSpace = Namespace || {};

Namespace.Child = function () { ... };
Namespace.Child.prototype = new Namespace.Parent();

Единственный способ, которым это работает, - это если parent_class.js включен перед child_class.js, что может не произойти, если скрипт конкатенации помещает дочерний код перед родительским кодом.

Есть ли способ написать этот код так, чтобы функциональность была такой же, но порядок написания кода уже не имеет значения?

Редактировать: Я забыл, что я тоже использую пространства имен, поэтому я добавил это и в код, что может немного изменить ситуацию.

Ответы [ 4 ]

3 голосов
/ 05 апреля 2011

Когда я работал над большими приложениями, я использовал requireJS , чтобы разделить мой код на модули и убедиться, что эти модули загружены в правильном порядке. Затем я просто отмечаю свой производный класс как зависящий от родительского класса.

RequireJS поставляется с инструментом, который будет объединять и минимизировать все ваши модули для производственного развертывания.

2 голосов
/ 11 ноября 2008

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

Не слишком ли простое решение, чтобы добавить значение порядка сортировки к каждому имени файла и сортировать по имени перед выполнением операции?

например:

01_parent.js
02_child.js

В противном случае возможно сохранение предварительно упорядоченного списка файлов в отдельном файле. Может быть, даже пойти еще дальше и предоставить иерархическую структуру зависимостей в XML для анализа? Это может быть слишком сложным решением: -D

Некоторые варианты способов решения проблемы, если у вас не было возможности определить, как пишутся файлы javascript.

0 голосов
/ 11 ноября 2008

Если объекты «пространством имен», то вам нужно либо перейти к решению для сборки, которое включает в себя конкатенацию по порядку, либо использовать что-то вроде dojo.require (но, очевидно, не специфично для dojo). По сути, вам нужна среда, которая предоставит вам возможность проверить, доступен ли заданный идентификатор, приостановить выполнение и включить его (через evaled ajax или вставленный тег сценария), если это не так.

0 голосов
/ 11 ноября 2008

Полагаю, вы могли бы сделать что-то действительно хакерское, как это:

setTimeout(function() { 
  if(typeof(Parent) != "undefined" && typeof(Child) != "undefined") { 
    Child.prototype = new Parent(); 
  } else {
    setTimeout(arguments.callee, 50);
  }
}, 50);

Этот код также может быть где угодно и будет непрерывно выполняться до тех пор, пока не загрузятся и Parent, и Child ... Но я бы не стал этого делать.

Лично я бы хотел убедиться, что ваши файлы объединены в правильном порядке.

...