Node.JS-在模块中使用原型

Node.JS - Using prototype in a module

本文关键字:原型 模块 JS- Node      更新时间:2023-09-26

所以我在node中写了一大堆特定于供应商的文件,这些文件都有类似的控制器模式,所以把它们剪下来放在一个公共文件中是有意义的。

你可以在这里看到我的通用控制器文件:https://gist.github.com/081a04073656bf28f46b

现在,当我在多个模块中使用它们时,每个连续加载的模块都会覆盖第一个模块。这是因为该文件只需要一次,并在加载时动态传递给每个模块(例如,这允许我添加额外的模块,并且这些模块能够添加自己的路由)。您可以在此处看到一个示例模块:https://gist.github.com/2382bf93298e0fc58599

你可以在这里的第53行看到,我意识到我们每次都需要创建一个单独的实例,所以我试图通过将standardControllers对象复制到一个新对象中,然后初始化新对象来创建一个新实例。这对代码没有任何影响,并且代码的行为方式完全相同。

有什么想法吗?我有点被这个卡住了!

我要做的第一件事是通过调用单一责任原则等来简化事情并减少耦合。http://www.codinghorror.com/blog/2007/03/curlys-law-do-one-thing.html

将这些模式放入它们自己的文件中,例如

models/client.js
models/assistant.js
models/contact.js

我还发现嵌入式文档+猫鼬通常是一个PITA。我可能会把所有这些都提升到顶级文档。

您不需要将对象的键括在引号中。

routes = {
   list: function() {} // no quotes is aok
}

典型REST应用程序中的"list"也称为"index"。无论如何

好吧,我会以不同的方式来分手。由于您需要中间件中index.js文件中的内容,所以它们会紧密耦合,这很糟糕。事实上,我想我会重写整件事,这样它会更整洁。很抱歉

我可能会用express资源控制器替换您的"中间件"文件https://github.com/visionmedia/express-resource(由express的作者构建)。对于restful控制器来说,这是一个很好的框架,例如您正在构建的控制器。自动装载机真的很好。

您可能还想查看:http://mcavage.github.com/node-restify/这是新的,我还没有试过,但我听到了一些好消息。

由于你正在构建的基本上是一个自动化的猫鼬crud系统,带有可选的覆盖,我会创建一个快速资源控制器作为你的基本

/controllers/base_controller.js

它可能看起来像

var BaseController = function() {} // BaseController constructor
BaseController.prototype.index = function() {
   // copy from your middleware
}
BaseController.prototype.show = function() {
   // copy from your middleware
}
BaseController.prototype.create = function() {
   // copy from your middleware
}
// etc
module.exports = BaseController

然后我会做一些类似的事情:

/controllers/some_resource_controller.js

可能看起来像:

var BaseController = require('./base_controller')
var NewResourceController = function() {
    // Apply BaseController constructor (i.e. call super())
    BaseController.apply(this, arguments) 
}
NewResourceController.prototype = new Base()
NewResourceController.prototype.create = function() {
    // custom create method goes here
}

module.exports = NewResourceController

然后使用它,你可以做:

var user = app.resource(myResourceName, new ResourceController());

…在某个循环中,它将myResourceName设置为您试图设置的任何crud。

这里有一些链接供您阅读:

  • http://tobyho.com/2011/11/11/js-object-inheritance/
  • http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/

而且,听起来你不是在写测试。编写测试。

  • http://www.codinghorror.com/blog/2006/07/i-pity-the-fool-who-doesnt-write-unit-tests.html