首先是一段历史,我们有一个由许多javascript文件组成的引擎,这些文件本质上是模块。这些模块返回一个分配给全局范围的类,尽管在指定的命名空间下。
引擎本身用于显示电子教学内容,每个不同的电子教学课程需要稍微不同的需求,这是我们根据必要的功能将javascript文件包含到页面中的位置。 (只有一个入口页面。)
我一直试图权衡它是否值得改为AMD,require.js和r.js,或者如果最好继续使用我们当前的系统,其中包括页面上所需的所有内容并将其最小化为一个脚本。
我去AMD的最大问题之一就是很难轻松扩展课程。例如,有时我们必须稍微调整原始类的行为。因此,我们在页面上添加另一个脚本include,通过复制原始类来扩展原始类,执行使用apply重写的原始函数,然后执行所需的任何其他代码。
您是否可以在不调整原始文件的情况下扩展AMD模块?或者我错过了这一点,我们最好还是坚持我们现在正在做的事情?
答案 0 :(得分:6)
我最近使用RequireJS开始了一个项目,我用来扩展下划线的方法归结为:
相关目录结构:
真正的下划线库转到 /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模块加载,但这对于使用非匀场AMD模块的此过程应该没有影响。
答案 1 :(得分: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;
});