使用AMD定义的Javascript模块如何扩展?

8
首先讲一下历史背景,我们有一个由许多JavaScript文件组成的引擎,这些文件本质上都是模块。这些模块返回一个单一的类,被分配给全局范围内的一个指定命名空间下。
引擎本身用于显示电子学习内容,每个不同的电子学习课程都需要稍微不同的需求,因此我们根据所需功能将JavaScript文件包含到页面中。(只有一个入口页面)。
我一直在权衡是否值得改用AMD、require.js和r.js,还是最好继续使用我们目前的系统,该系统将所有必需的内容包含在页面中,并将其最小化为一个脚本。
如果采用AMD,我最大的问题之一是似乎更难轻松地扩展一个类。例如,有时我们必须稍微调整原始类的行为。因此,我们在页面上添加另一个脚本,通过复制原型来扩展原始类,使用apply执行正在被覆盖的原始函数,然后执行任何其他所需的代码。
你能在不修改原始文件的情况下扩展AMD模块吗?或者我没有理解其中的要点,最好继续使用我们目前的方法呢?
2个回答

6

最近我开始了一个使用RequireJS的项目,我使用的方法是对underscore进行扩展,大致如下:

相关目录结构:

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

真正的underscore库在/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来将underscore加载为AMD模块,但这对于非shimmed AMD模块的处理不会产生任何影响。


0

你可以创建包含构造函数的模块。当这些模块被引入时,它们就可以使用了,然后你可以随后创建对象。

在require中的示例:

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

嗨Joseph,感谢您的回复,但那不是我要问的问题。您正在创建原始构造函数的实例。我想要一个“引擎”的定义,它用于另一个项目的定义,比如说“contentScreen”。然而,在“引擎”的定义和“contentScreen”的创建之间,我想稍微扩展一下“引擎”。 - John_
@John_ 你所说的“略微扩展”是什么意思?是建立一个修改后的构造函数,然后使用该修改后的构造函数吗?这可能会有所帮助 - Joseph
基本上是的,我不想创建一个扩展原始类的新类,我实际上想要扩展原始类并使用它,因为就其他方面而言,它仍然是相同的类。据我所知,我不能用AMD做到这一点? - John_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接