javascript - 如何销毁BackboneFactory中创建的对象以及它们存储在哪里?

标签 javascript backbone.js factory backbone-model

这是 BackboneFactory 的来源,相当于 FactoryGirl 的主干网:

// Backbone Factory JS
// https://github.com/SupportBee/Backbone-Factory

(function(){
  window.BackboneFactory = {

    factories: {},
    sequences: {},

    define: function(factory_name, klass, defaults){

      // Check for arguments' sanity
      if(factory_name.match(/[^\w-_]+/)){
        throw "Factory name should not contain spaces or other funky characters";
      }

      if(defaults === undefined) defaults = function(){return {}};

      // The object creator
      this.factories[factory_name] = function(options){
        if(options === undefined) options = function(){return {}};
        arguments =  _.extend({}, {id: BackboneFactory.next("_" + factory_name + "_id")}, defaults.call(), options.call());
        return new klass(arguments);
      };

      // Lets define a sequence for id
      BackboneFactory.define_sequence("_"+ factory_name +"_id", function(n){
        return n
      });
    },

    create: function(factory_name, options){
      if(this.factories[factory_name] === undefined){
        throw "Factory with name " + factory_name + " does not exist";
      }
      return this.factories[factory_name].apply(null, [options]);        
    },

    define_sequence: function(sequence_name, callback){
      this.sequences[sequence_name] = {}
      this.sequences[sequence_name]['counter'] = 0;
      this.sequences[sequence_name]['callback'] = callback; 
    },

    next: function(sequence_name){
      if(this.sequences[sequence_name] === undefined){
        throw "Sequence with name " + sequence_name + " does not exist";
      }
      this.sequences[sequence_name]['counter'] += 1;
      return this.sequences[sequence_name]['callback'].apply(null, [this.sequences[sequence_name]['counter']]); //= callback; 
    }
  }
})();

所以看起来经过一些复杂的逻辑后,create 方法将创建我们在主干中定义的模型的新对象。如果我们有一个 User 模型,Backbone.create(User) 将创建一个新的用户对象。

  • 这些对象存储在哪里?
  • 它们与生产环境共享相同的数据库吗?
  • 如果在内存中,它们最终会被垃圾收集吗?

简而言之,我关心运行测试套件时这些对象会发生什么。

最佳答案

If we have a User model... Backbone.create(User) will create a new user object.

它是 BackboneFactory.create('user'),仅当您之前使用 BackboneFactory.define('user',用户);

Where are these objects stored?

在全局 BackboneFactory 对象的以下属性中:

factories: {},
sequences: {},

Do they share the same database as production?

这无关紧要,因为工厂仅从您已经定义的模型类返回模型实例。

假设您有这个模型:

var User = Backbone.Model.extend({
    urlRoot: "api/user",
    defaults: {
        name: "Foo",
        randomNumber: 4
    }
});

使用工厂实例化:

BackboneFactory.define('user', User);
// somewhere later
var instance = BackboneFactory.create('user', { name: "bar" });

与手动实例化相同。

var instance = new User({ name: "bar" });

If it's in memory, are they garbage collected eventually?

看起来它没有提供删除工厂的简单功能,但它并不是真正有用,因为您创建工厂是为了在应用程序中使用它们。

您可以手动删除工厂哈希和/或序列:

BackboneFactory.factories = {};
BackboneFactory.sequences = {};

但除非出现特定问题,否则我不会在正常用例中这样做。对于测试套件,也许这是“重置”BackboneFactory 对象的最简单方法。

<小时/>

话虽如此,我不会按原样使用该库。有很棒的想法,但是对于这样一个简单的库,代码缺少很多改进。一大禁忌是它默认是全局的,并且不可能创建不同的 BackboneFactory 实例。它有 problems of the singleton pattern .

关于javascript - 如何销毁BackboneFactory中创建的对象以及它们存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41025345/

相关文章:

javascript - 使用可选的第一个参数记录 JavaScript

javascript - 重置 View 集合时如何触发渲染

javascript - Backbone.js - 排序和迭代 - 比较器不起作用

c++ - C++ 中工厂和动态分配的问题

php - 使用工厂获取特定对象有什么优点吗?

javascript - 根据 data-* 属性过滤选择选项

javascript - 如何在 html 正文中使用头部脚本中定义的变量

javascript - 重写 .fetch() 可处理虚假数据、urlRoot 错误和实际模型 ajax 请求

c++ - 对象工厂中的类型映射

javascript - 将 XML 加载到 Google Chrome 中的 Document 对象