Переслать декларацию в Javascript - PullRequest
5 голосов
/ 19 сентября 2011

Фон

Я создаю приложение на основе JavaScript, которое по-разному работает на мобильных и настольных устройствах.Однако, за исключением манипуляций с DOM, большая часть кода является общей для обеих платформ, поэтому я структурировал все файлы, такие как: * foo.core.js * foo.mobile.js * foo.web.js

И в надеждеиспользовать объектно-ориентированные методы для написания более чистого кода.

Проблема:

У меня есть два файла JavaScript с классами

Файл 1:

function ClassA()
{}

ClassA.prototype.foo = function(){};

GreatGrandChildA.prototype = new GrandChildA(); // this is where the error is
function GreatGrandChildA ()
{}

Файл 2:

ChildA.prototype = new ClassA();
function ChildA () // ChildA inherits ClassA
{}

GrandChildA.prototype = new ChildA()
function GrandChildA () // GrandChildA inherits ClassA
{}

Обычно на таком языке, как C ++, я бы с удовольствием объявил GrandChildA прямо в файле 1. Я хотел бы знать, как это сделать в Javascript

Редактировать:

Если я создаю один файл, содержащий все четыре класса - в том же порядке, в котором они загружены, пример работает точно так, как ожидается:

http://jsfiddle.net/k2XKL/

Ответы [ 4 ]

3 голосов
/ 19 сентября 2011

Простая логика для загрузки неупорядоченного файла js:

File1:

// ClassB: inherite from ClassA
(function ClassB_Builder() {
  if(window.ClassB)return; // ClassB is already defined;
  if(!window.ClassA) { // ClassA is already not defined;
     setTimeout(ClassB_Builder,0); // shedule class building
     return;
  }
  ClassB=function() {
  }
  ClassB.prototype=new ClassA;
  ClassB.prototype.constructor=ClassB; // can be important for inheritance!!!
})();

File2:

// ClassA: base class
(function ClassA_Builder() {
  ClassA=function() {
  }
})();

// ClassC: inherite from ClassB
(function ClassC_Builder() {
  if(window.ClassC)return; // ClassC is already defined;
  if(!window.ClassB) { // ClassB is already not defined;
     setTimeout(ClassC_Builder,0); // shedule class building
     return;
  }
  ClassC=function() {
  }
  ClassC.prototype=new ClassB;
  ClassC.prototype.constructor=ClassC; // can be important for inheritance!!!
})();
1 голос
/ 19 сентября 2011

Самый разумный способ выполнить то, что вы хотите, это сделать 2 отдельные версии вашего исходного кода. Вы захотите минимизировать, запутать свой код и объединить все исходные файлы в любом случае, поэтому имеет смысл создать сценарий сборки (python был бы отличным языком для простого сценария сборки), который вы настраиваете для объединения определенных мобильных устройств. файлы в один (плюс файлы, которые обе версии совместно используют) и файлы, не относящиеся к мобильным устройствам, в другой файл (а также общие файлы). Кроме того, вы можете позже добавить автоматическую запутывание и gzipping. Затем вы можете предоставить соответствующую исходную версию соответствующему клиенту.

1 голос
/ 19 сентября 2011

Я предполагаю, что на вашей HTML-странице вы импортируете Файл 1, а затем Файл 2.

В Файл 1 вы должны увидеть исключение, потому что «GrandChildA» имеет значение undefined .Объявление функции не сделано, потому что Файл 2 еще не загружен.

В Файл 2 , вы можете сделать:

ChildA.prototype = new ClassA();
function ChildA () // ChildA inherits ClassA
{}

, потому что Javacriptсреда выполнения подняла вашу именованную функцию"ClassA" до код выполняется до ChildA.prototype = new ClassA();

Пожалуйста, прочитайте больше о функции подъема, и вы должны делать это в такой ситуации наhttp://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

0 голосов
/ 19 сентября 2011

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

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

...