-3

我对javascript很陌生,我正在努力解决一个简单的问题。我必须将代码拆分为单独的文件。例如,我有一个名为 Database.js 的文件。在该文件中,我有以下几行:

function Database(){
    //someStuff
    this.fetchAll = function(){
        //some stuff
        return something;
    }
}

现在我想使用文件 app.js 中的 Database.js 代码。所以我在 app.js 中编写了以下代码:

var Database = require('Database');
var myDB = new Database();
var result = myDB.fetchAll();

但是,我得到了错误Script Error = '[object Database]' is not a constructor (evaluating 'new Database()') at app.js (line 3).

我的错误是什么?

4

6 回答 6

5

在开始开发之前,您需要彻底了解Titanium 中的 CommonJS 模块。那么它对你来说会更简单。另请参阅require函数

让我们来看看你的错误。[ERROR] [object Database]' is not a constructor (evaluating 'new Database()') at app.js (line 3)表示您创建的模块不是构造函数。您的构造函数可能不会返回任何值。阅读CommonJS 模块的简单用法。我相信它会解决你的问题。

还有一种替代方法,您可以在 app.js 中包含 Database.js 文件。你不需要返回任何东西,也不需要使用 require 函数。您只需要使用include 方法。只需Ti.include('Database.js');在 app.js 中编写,您就可以访问 Database.js 文件中的所有全局变量和函数

于 2013-03-04T12:01:29.987 回答
2

这个问题很老了,但还没有回答。因此,我将为访问这里的任何人提供答案。

您必须将您的功能导出为全局。为此,您将其声明如下

exports.fetchAll = function Database(){
  //some stuff
  return something;
};

您还可以声明该函数,以便在文件中全局和本地使用它

var fetchAll = function Database(){
  //some stuff
  return something;
};
exports.fetchAll = fetchAll;

然后假设文件名是Database并且它与app.js在同一个文件夹中,你可以使用它如下

var Database = require('Database');
var result = Database.fetchAll();
于 2015-01-21T12:29:12.897 回答
1

编辑:这个答案是 javascript 通用的,它不面向 Appacelerator Titanium。


没有这样的includerequire在javascript中。另一方面,您可以执行以下操作之一

在脚本之前包含一个脚本标记以包含 Database.js

<script type="text/javascript" src="Database.js" >

或者

动态添加

function loadScript(url, callback)
{
    // adding the script tag to the head as suggested before
   var head = document.getElementsByTagName('head')[0];
   var script = document.createElement('script');
   script.type = 'text/javascript';
   script.src = url;

   // then bind the event to the callback function 
   // there are several events for cross browser compatibility
   script.onreadystatechange = callback;
   script.onload = callback;

   // fire the loading
   head.appendChild(script);
}
于 2013-03-03T11:38:33.890 回答
0

这里只是一个快速的猜测。如果你使用 CommonJS,那么你必须告诉模块外应该有什么可用。您布置数据库“对象”的方式需要添加:

module.exports = Database;

在你的模块中的某个地方。我总是把它们放在最后——但不确定这是一个要求。

您还可以通过指定使单个函数在模块外部可用:

exports.getMyDatabase = getMyDatabase;

其中“getMyDatabase”是您在模块中指定的函数。我使用这种方式从外部“隐藏”某些功能的某些实现细节,并且只提供我希望开发人员能够调用的功能;-)

/约翰

于 2015-01-23T17:32:14.207 回答
0

The problem seemed to be the usage of the variable name 'Database'. Maybe there is somewhere a name collusion.

I am sorry that I did not know that the usage of require is not a basic concept of js.

于 2013-03-03T11:48:24.113 回答
-4

我认为这是 require js 的正确用法:

require(["Database"], function() {
    var myDB = new Database();
    var result = myDB.fetchAll();
});

http://requirejs.org/docs/jquery.html

于 2013-03-03T11:35:54.327 回答