Javascript 使用node.js导出类

Javascript 使用node.js导出类,javascript,node.js,jasmine,jasmine-node,Javascript,Node.js,Jasmine,Jasmine Node,我在一个名为bob_test.spec.js require('./bob'); describe("Bob", function() { var bob = new Bob(); it("stating something", function() { var result = bob.hey('Tom-ay-to, tom-aaaah-to.'); expect(result).toEqual('Whatever'); }); }); "use strict

我在一个名为
bob_test.spec.js

require('./bob');

describe("Bob", function() {
  var bob = new Bob();

  it("stating something", function() {
    var result = bob.hey('Tom-ay-to, tom-aaaah-to.');
    expect(result).toEqual('Whatever');
  });
});
"use strict";

var Bob = function() {
}

Bob.prototype.hey = function (text) {
  return "Whatever";
}

module.exports = Bob;
为了通过测试,我在一个名为
bob.js的文件中编写了以下生产代码

require('./bob');

describe("Bob", function() {
  var bob = new Bob();

  it("stating something", function() {
    var result = bob.hey('Tom-ay-to, tom-aaaah-to.');
    expect(result).toEqual('Whatever');
  });
});
"use strict";

var Bob = function() {
}

Bob.prototype.hey = function (text) {
  return "Whatever";
}

module.exports = Bob;
当我使用jasmine节点运行测试时,
-我得到以下结果 F

故障:
1) Bob遇到一个声明异常
信息:
ReferenceError:未定义Bob
堆栈跟踪:
ReferenceError:未定义Bob
在空。(/Users/matt/Code/oss/consived practice/exercism/javascript/bob/bob_test.spec.js:4:17)
反对。(/Users/matt/Code/oss/consived practice/exercism/javascript/bob/bob_test.spec.js:3:1)
在模块处编译(Module.js:456:26)
在Object.Module.\u extensions..js(Module.js:474:10)
在Module.load(Module.js:356:32)
在Function.Module.\u加载(Module.js:312:12)
at Module.require(Module.js:364:17)
根据需要(模块js:380:17)
以0.02秒完成
1个测试,1个断言,1个失败,0已跳过

基于我对Javascript的理解,我觉得这应该是可行的。node.js在构造函数和模块导出方面做了哪些不同的事情来阻止它工作?我认为应该这样做

require返回一个对象,您应该将它存储在某个地方

var Bob = require('./bob');
然后使用这个对象

var bobInstance = new Bob();

这将修复通过jasmine节点运行测试时出现的错误:

// Generated by CoffeeScript 1.6.2
(function() {
  var Bob;

  Bob = (function() {
    function Bob() {}

    Bob.prototype.hey = function(what) {
      return 'Whatever.';
    };

    return Bob;

  })();

  module.exports = Bob;

}).call(this);
改进答案:


因此,您可以创建一个对象,将其传递给module.exports
module.exports=new Bob()

如果可以使用ECMAScript 2015,则可以声明和导出类,然后使用分解结构“导入”类,而无需使用对象访问构造函数

在您这样导出的模块中

class Person
{
    constructor()
    {
        this.type = "Person";
    }
}

class Animal{
    constructor()
    {
        this.type = "Animal";
    }
}

module.exports = {
    Person,
    Animal
};
那么在哪里使用它们呢

const { Animal, Person } = require("classes");

const animal = new Animal();
const person = new Person();

但是,这将创建一个单例,这不是您可能想要的,特别是如果类有它写入的私有变量,因为它将在使用Bob对象的所有实例中共享。更好的方法是只导出Bob,然后在您打算使用它的模块中实例化它。太好了!这是救命稻草