2012-04-25 26 views
7

Primero un poco de historia, tenemos un motor que se compone de muchos archivos javascript que son esencialmente módulos. Estos módulos devuelven una clase única que está asignada al ámbito global, aunque bajo un espacio de nombre especificado.¿Cómo se puede ampliar un módulo Javascript definido con AMD?

El motor en sí se utiliza para mostrar el contenido de eLearning, con cada curso de eLearning diferente que requiere necesidades ligeramente diferentes, que es donde incluimos los archivos de JavaScript en la página en función de la funcionalidad necesaria. (Solo hay una página de entrada).

He estado tratando de sopesar si vale la pena cambiar a AMD, require.js y r.js o si es mejor quedarse con nuestro sistema actual que incluye todo lo requerido en la página y lo minimiza en una secuencia de comandos.

Uno de mis mayores problemas con ir a AMD sería que parece ser más difícil extender una clase fácilmente. Por ejemplo, a veces tenemos que ajustar ligeramente el comportamiento de la clase original. Así que agregamos otro script para incluir en la página que amplíe la clase original copiando el prototipo original, ejecute la función original que se reemplaza con apply y luego haga el código adicional requerido.

¿Se puede ampliar un módulo AMD sin adaptar el archivo original? ¿O me estoy perdiendo el punto y nos quedamos mejor con lo que estamos haciendo en este momento?

Respuesta

6

Recientemente he comenzado un proyecto utilizando RequireJS, y el método que utilizo para extender subrayado reduce a algo como esto:

relevante estructura de directorios:

  • /scripts
  • /scripts/underscore.js
  • /scripts/base/underscore.js

La biblioteca subrayado reales va a /scripts/base/underscore.js.

Mis extensiones van en /scripts/underscore.js.

El código en /scripts/underscore.js se ve así:

define(['./base/underscore'], function (_) { 
    'use strict'; 

    var exports = {}; 

    // add new underscore methods to exports 

    _.mixin(exports); // underscore's method for adding methods to itself 

    return _; // return the same object as returned from the underscore module 
}); 

Para una extensión normal, podría parecerse más a esto:

define(['underscore', './base/SomeClass'], function (_, SomeClass) { 
    'use strict'; 

    _.extend(SomeClass.prototype, { 
     someMethod: function (someValue) { 
      return this.somethingOrOther(someValue * 5); 
     } 
    }); 

    return SomeClass; 
}); 

Nota sobre subrayado: En otra Utilicé el RequireJS shim-config para que el guión bajo se cargara como un módulo AMD, pero eso no debería tener ningún efecto en este proceso con los módulos AMD no atenuados.

0

Puede tener módulos que contengan sus funciones de constructor. cuando se incluyen estos módulos, están listos para su uso. luego puedes crear objetos a partir de ellos luego.

ejemplo requiere:

//construction.js 
define(function(){ 

    //expose a constructor function 
    return function(){ 
     this.... 
    } 
}); 

//then in foo.js 
define([construction],function(Construction){ 
    var newObj = new Construction; //one object using constructor 
}); 

//then in bar.js 
define([construction],function(Construction){ 

    //play with Construction's prototype here then use it 

    var newObj = new Construction; 
}); 
+0

Hola Joseph, gracias por tu respuesta, pero esa no es la pregunta que estaba haciendo. Está creando instancias del constructor original.Me gustaría tener una definición de decir 'motor', que se usa en una definición para otro elemento, digamos 'pantalla de contenido'. Sin embargo, entre la definición de 'motor' y la creación de 'contentScreen' me gustaría extender 'engine' ligeramente. –

+0

@John_ ¿qué quiere decir con "extender levemente"? construyendo un constructor modificado y luego usar ese constructor modificado? [esto podría ayudar] (http://stackoverflow.com/a/10101604/575527) – Joseph

+0

Esencialmente sí, no quiero crear una nueva clase que extienda el original, de hecho quiero extender el original y usarlo, porque en lo que respecta a todo lo demás, sigue siendo la misma clase. Por lo que puedo decir, ¿no puedo hacer eso con AMD? –

Cuestiones relacionadas