2012-04-25 2 views
7

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

Само устройство используется для отображения содержимого электронного обучения с каждым разным курсом eLearning, требующим немного разных потребностей, в котором мы включаем файлы javascript на страницу, основываясь на необходимой функциональности. (Существует только одна страница входа).

Я пытаюсь взвесить, если это стоит изменить на AMD, require.js и r.js, или если лучше остановиться с нашей текущей системой, которая включает все необходимое на странице и сводит к минимуму ее в один скрипт.

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

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

ответ

6

Я недавно начал проект с использованием RequireJS, и метод я использую, чтобы расширить подчеркивание сводится к тому, что-то вроде этого:

Структура Соответствующий каталог:

  • /скрипты
  • /scripts/underscore.js
  • /scripts/base/underscore.js

Настоящая библиотека Подчеркивание идет к /scripts/base/underscore.js.

Мои расширения идут /scripts/underscore.js.

Код в /scripts/underscore.js выглядит следующим образом:

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

Для нормального расширения, это может выглядеть следующим образом:

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

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

    return SomeClass; 
}); 

Примечание по подчеркиванием: В другом месте Я использовал утилиту RequireJS shim-config, чтобы получить подчеркивание для загрузки в качестве модуля AMD, но это не должно сказаться на этом процессе с не-shimmed-модулями AMD.

0

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

пример требует:

//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

Привет, Джозеф, спасибо за ваш ответ, но это не вопрос, который я задавал. Вы создаете экземпляры исходного конструктора.Я хотел бы иметь определение say 'engine', которое используется в определении для другого элемента, скажем, 'contentScreen'. Однако между определением «двигатель» и созданием «contentScreen» я хотел бы немного расширить «движок». –

+0

@John_, что вы подразумеваете под «растяжением»? построив модифицированный конструктор и затем используя этот модифицированный конструктор? [это может помочь] (http://stackoverflow.com/a/10101604/575527) – Joseph

+0

По сути да, я не хочу создавать новый класс, который расширяет оригинал, я действительно хочу расширить оригинал и использовать его, потому что, насколько все остальное, это все тот же класс. Насколько я могу судить, я не могу сделать это с AMD? –