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

StackOverflow https://stackoverflow.com/questions/279391

  •  07-07-2019
  •  | 
  •  

Вопрос

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

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

родительский_класс.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();

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

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

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

Это было полезно?

Решение

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

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

например:

01_parent.js
02_child.js

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top