【问题标题】:Export objects vs functions NodeJs导出对象与函数 NodeJs
【发布时间】:2015-02-19 06:52:42
【问题描述】:

导出对象{} vs 导出函数

我正在开发一个练习应用程序,遇到了一个问题我什么时候需要导出对象{}而不是函数类?

场景示例:

我正在使用对象样式构建一个简单的身份验证module

// file auth.js
module.exports = {

    login: function() {
       // code login
    },

    logout: function() {
      // code logout
    },

    register: function() {
      // code register
    }
}

这里我使用的是匿名函数风格

module.exports = function() {

        return {
            login: function() {
               // code login
            },

            logout: function() {
              // code logout
            },

            register: function() {
              // code register
            }
         }
    }

需要

当我想需要这个模块时,我会这样做:

var auth = require('auth');

auth.login(); // trigger login function via object
auth().login() // trigger login function via function

这两种方法都适用,但我很困惑选择哪种方法更合适以及为什么。

问题

  • 您如何理解模块设计、何时适合导出、对象匿名函数要实例化的命名函数?

  • 当需要这些 函数对象 时,require 方法的行为有哪些不同?

【问题讨论】:

  • It will work with both the approaches, - 不会。要使第二种方法起作用,您需要执行var auth = require('auth')();
  • 是的,对不起,你是对的,只是纠正了那个

标签: javascript node.js function object


【解决方案1】:

您如何理解在您的模块设计中,何时适合导出、对象、匿名函数、命名函数来实例化?

  • 真正的极简主义者的目标是在足够的情况下导出单个函数。这取决于您模块的范围,并假设一个小而专注的目的。
  • 当您需要一组函数来获得一组有意义的功能时,请导出相关函数的对象。例如,tempConversion 模块可能同时具有 cToFfToC 函数。
  • 如果你在做OO,导出构造函数就可以了。
  • 返回实际负载(可以是对象或函数)的闭包函数对于配置选项很有用。例如,var tip = require('computeTip')(18); 可以将 18 存储在闭包中并返回一个函数,该函数在使用数字调用时会计算 18% 的小费。

这里有一个经验法则:如果你只导出一个命名函数,如require('average').average(listOfNumbers),那就是多余的,所以直接导出average 函数,让它更简洁。如果您要公开多个函数,请使用属性为函数的对象。

当需要这些函数或对象时,require 方法的行为有哪些不同?

  • 没有区别。 require 有一个可以适应这些技术的单一行为。

【讨论】:

  • 感谢您为我指出正确的方向,我只是不确定您的观点true minimalists aim to export a single function if that will suffice 你能做一个单一功能的例子吗:) 真的很感激
  • 当然。 substack 是 npm 上最多产的作者之一,也是坚定的极简主义者。他的 arg-parsing 库极简主义者就是这样做的。 github.com/substack/minimist/blob/…
  • 非常感谢,这个例子很有意义,但我看到他正在向模块传递 2 个参数,如果我的模块不需要任何参数,传递 @ 总是有意义的987654330@ 喜欢他吗?我将打开这个帖子一段时间以查看其他答案,您是正确答案的候选人。
  • 他没有传递 2个参数,他接受来自他的调用者的2个参数。
  • 是的,没错!感谢经验法则!我想我明白了 :) 非常感谢您的帮助。
【解决方案2】:

在您的两个示例中,您实际上都返回了一个对象而不是函数类。在第二种情况下,您通过执行函数来获取对象。为了将函数用作类,您应该返回一个充当构造函数的函数,然后使用 new 运算符进行实例化。

话虽如此,如果我将我的模块视为一个单例,我更喜欢一个对象而不是一个类,这对于包含它的每个文件都是通用的。一个示例是一个实现对我的数据库的公共访问层的模块。

如果您打算多次实例化一个类,它会更有意义。例如,您的数据库架构的特定模型类,如 User 类。

【讨论】:

  • 非常感谢您的回答,这很有意义。那么在这种情况下,Auth 模块使用对象是否有意义?因为它应该是单例的,不需要多次设置。只有方法会与传递的参数一致吗?
  • @Fabrizio Correnct,您可以将对象用于 Auth 模块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 2015-01-05
相关资源
最近更新 更多