我正在将C ++项目移植到Javascript。我想保留面向对象的设计,因此决定使用requireJS将移植的类组织为模块。
我模拟这样的继承:

define(
[
],

function()
{
    'use strict';

    function Base( arguments )
    {
    }

    function Inherited( arguments )
    {
        Base.call( this, arguments );
    }

    Inherited.prototype = Object.create( Base.prototype );

    return {
                Inherited   : Inherited
            };
});


假设我将此模块保存到文件“ inherited.js”,并在另一个模块中需要它:

define(
[
    'inherited'
],

function( Inherited )
{
    'use strict';

    function Whatever( arguments )
    {
        var inherited = new Inherited.Inherited( arguments );
    }

    return {
                Whatever    : Whatever,
            };
});


现在困扰我的是,我必须在创建对象时两次声明类名称,一次是作为模块名称,一次是函数/类的名称。

相反,我希望能够致电:

var inherited = new Inherited( arguments );


我可以通过在'inherited.js'中返回一个匿名函数来实现这一点,但是我再也不能定义继承依赖了。

我意识到模块背后的想法是防止污染全局名称空间-请记住,上面发布的代码仅在我的库中使用,该库在实际应用中使用之前包装在单个模块中。

因此,要实例化继承的函数/类,我必须键入Library.Inherited.Inherited,但我希望使用Library.Inherited。

还有另一种方法吗?

最佳答案

只需返回Inherited构造函数:

define(function () {
  function Inherited() {
  }

  Inherited.prototype = {
  };

  return Inherited;
});


模块导出值可以是可返回类型。

09-04 04:03