Create new instance from singleton

Refresh

December 2018

Views

187 time

8

Intro:

I have some legacy code that creates a singleton:

define(['backbone', 'MyModel'], function (Backbone, MyModel) {

  var MyCollection = Backbone.Collection.extend({
    model: MyModel,
    initialize: function () {
      //...
    }
  });

  return new MyCollection();
});

And for test purposes I need to generate new instances to inject them as dependeces.

Question:

Is there any way to generate new instances of the singleton without modifying the original code?

What I've done:

I came with a solution: add the class as a property of the instace

    initialize: function () {
      this.ClassObject = MyCollection;
      //...
    }

and then instantiate it

var myCollection = require('myCollection');
var myCollectionInstance = new myCollection.ClassObject();

This solution modifies the class and I'd like to avoid it.

I also tryed creating a copy of the singleton:

function generateNewCollection() {
  var F = function () {};
  F.prototype = myCollection;
  return new F();
}

It generates a new instance but it doesn't create new instances of its dependences, so the environment is still dirty for the next tests.

2 answers

2

Решение: использовать функцию-конструктор от прототипа.

var newMyCollection = new (Object.getPrototypeOf(myCollection).constructor);
-1

Добавление определения класса как свойство экземпляра является единственным способом я никогда не находил , чтобы решить эту проблему. Вы можете стандартизировать в Klassкачестве имени свойства, что , кажется, как люди идут. Решение может чувствовать себя немного грязным, но он работал очень хорошо , по крайней мере для меня.

Еще одно усовершенствование, так как я заметил, что вы используете шаблон модуля, должен иметь модуль возвращает экземпляр. Таким образом, он управляет одноплодным шаблоном для вас, так как он будет включать только каждую зависимость один раз.

Вот как это выглядит:

define ['models/sprockets'],(Sprocket) ->
  MyCollection = Backbone.Collection.extend
    model: Sprocket
    initialize: -> console.log 'initialized'
  myCollection = new MyCollection()
  myCollection.Klass = MyCollection
  return myCollection # If managed by requireJs or curl, this module will always return you the same singleton and will have the class available on the `Klass` property