Como você tirar proveito da herança prototípica sem a necessidade de incluir arquivos em uma ordem específica?

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

  •  07-07-2019
  •  | 
  •  

Pergunta

Ao desenvolver JavaScript, que tendem a separar o código JavaScript para fora em diferentes arquivos e, em seguida, executar um script para concatenar os arquivos e comprimir ou compactar o arquivo resultante. No final, eu tenho um arquivo que eu preciso incluir no meu local de produção.

Esta abordagem tem geralmente funcionou, mas eu comecei a correr em um problema com a herança prototípica. Especificamente, se herda uma classe de outra classe, o arquivo para a classe pai precisa ser já para a herança ao trabalho incluído. Se o script de concatenação que estou usando é simplesmente concatenando um diretório cheio de arquivos, a classe filho pode ocorrer no código antes a classe pai. Como esta:

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();

As únicas forma como isto funciona é se parent_class.js está incluído antes child_class.js, o que pode não acontecer se o script concatenação coloca o código da criança antes do código pai.

Existe uma maneira de escrever este código para que a funcionalidade é a mesma, mas a ordem em que o código é escrito não importa mais?

Edit:. Eu esqueci que eu estou usando namespaces bem, então eu acrescentou que para o código, bem como, o que pode mudar as coisas um pouco

Foi útil?

Solução

Se o script concatenação que estou usando é simplesmente concatenando um diretório cheio de arquivos, a classe filho pode ocorrer no código antes a classe pai.

É solução uma simples demais para preceder um valor ordem de classificação para cada nome de arquivo, e classificar por nome antes de realizar a operação?

por exemplo:

01_parent.js
02_child.js

Caso contrário, talvez manter uma lista pre-ordenado de arquivos em um arquivo separado. Talvez até mesmo ir um passo além e proporcionar uma estrutura de dependência hierárquica em XML para analisar? Este pode ser o excesso de engenharia da solução um pouco :-D

Algumas opções para maneiras de lidar com o problema se você não tinha nenhuma maneira de determinar como os arquivos javascript são escritos.

Outras dicas

Quando eu trabalhei em grandes apps, eu tenho uso RequireJS para dividir o meu código em módulos, e certifique-se esses módulos são carregados na ordem correcta. Então eu só marcar a minha classe derivada como dependendo da classe pai.

RequireJS vem com uma ferramenta que irá combinar e apoucar todos os seus módulos para implantação de produção também.

Eu suponho que você poderia fazer algo realmente hackish assim:

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

Esse código também poderia ser em qualquer lugar, e que continuamente executado até que tanto o Parent eo Child foram carregados ... Mas eu não faria isso.

Pessoalmente, gostaria apenas de garantir que seus arquivos são combinados na ordem correta.

Se os objetos são "namespace", então você tem que mudar para uma solução de construção que incorpora na ordem de concatenação ou usar algo como dojo.require (mas obviamente não dojo específica ). Basicamente, você quer uma estrutura que irá fornecer-lhe a capacidade de verificar se um determinado identificador está disponível e execução de pausa e incluí-lo (via ajax evaled ou um tag script inserido) se não é.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top