Soru Node.js ile sınıfları dışa aktarma


Jasmine-node adlı bir dosyada çalıştırılan aşağıdaki sınama kodum var 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');
  });
});

Test geçmek için aşağıdaki üretim kodunu bir dosyaya yazdım. bob.js

"use strict";

var Bob = function() {
}

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

module.exports = Bob;

Testi çalıştırdığımda - kullanarak jasmine-node . - Aşağıdakileri aldım     F

Failures:

1) Bob encountered a declaration exception
Message:
    ReferenceError: Bob is not defined
Stacktrace:
    ReferenceError: Bob is not defined
    at null.<anonymous> (/Users/matt/Code/oss/deliberate-practice/exercism/javascript/bob/bob_test.spec.js:4:17)
    at Object.<anonymous> (/Users/matt/Code/oss/deliberate-practice/exercism/javascript/bob/bob_test.spec.js:3:1)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)

Finished in 0.02 seconds
1 test, 1 assertion, 1 failure, 0 skipped

Javascript ile ilgili olarak anladığım kadarıyla, bunun işe yarayacağını hissediyorum. Node.js'nin yapıcı işlevler ve modül ihracı ile farklı şekilde yaptığı şey, bunun çalışmayı engellediğini düşünmeyi sevdiğim gibi?


32
2017-08-02 14:59


Menşei




Cevaplar:


bir nesneyi iade etmek gerekirse, bir yere saklamanız gerekir

var Bob = require('./bob');

ve sonra bu nesneyi kullan

var bobInstance = new Bob();

50
2017-08-02 15:03



Harika! bu bir hayat kurtarıcı - Dipu Raj


Bu, testlerinizi jasmine-node ile çalıştırırken yaşadığınız hatayı düzeltmelidir:

// 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);

1
2017-08-02 23:05





geliştirme marvin en Cevap:

"use strict";
var Bob = function() {}

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

module.exports = new Bob();

// another file
var Bob = require('./bob');
Bob.hey('text');

Böylece, onu module.exports'a ileten bir nesne oluşturabilirsiniz. module.exports = new Bob();


1
2018-05-17 11:42



Bu, tek başına, ancak, özellikle de sınıfın yazdığı özel değişkeni varsa, kullanmak istediğiniz her durumda paylaşılmayacağı için, isteyebileceğiniz bir şey olmayan bir singleton yaratacaktır. şilin nesne. Daha iyi bir yol, yalnızca dışa aktarmaktır şilin ve sonra bunu kullanmak niyetinde olan modülde başlatır. - sk4l


ECMAScript 2015'i kullanabiliyorsanız, sınıflarınızı ilan edip dışa aktarabilir ve daha sonra kuruculara ulaşmak için bir nesneyi kullanmanıza gerek kalmadan yıkımı kullanarak sınıflarınızı 'içe aktarabilirsiniz'.

Modülde böyle ihracat yapıyorsunuz

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

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

module.exports = {
    Person,
    Animal
};

sonra onları nerede kullanırsın

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

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

1
2018-03-02 20:26