Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在主干网中共享相同功能的最佳方式_Javascript_Backbone.js_Mixins - Fatal编程技术网

Javascript 在主干网中共享相同功能的最佳方式

Javascript 在主干网中共享相同功能的最佳方式,javascript,backbone.js,mixins,Javascript,Backbone.js,Mixins,我目前的情况是:对于主干.Collection(但也应该是主干.Model),我以这种方式扩展类(1)。 我想分享的功能如下: 1) startPolling和stopPolling应该是可从所有主干网集合和最终主干网模型访问的公共方法 2) executepoll和onFetch应该是私有方法 在所有Backbone.Collection/Backbone.Model之间共享startPolling和stopPolling的最佳方式是什么 我的想法是创建一个新文件utils/backbone.

我目前的情况是:对于
主干.Collection
(但也应该是
主干.Model
),我以这种方式扩展类(1)。
我想分享的功能如下:
1)
startPolling
stopPolling
应该是可从所有主干网集合和最终主干网模型访问的公共方法
2)
executepoll
onFetch
应该是私有方法

在所有
Backbone.Collection/Backbone.Model
之间共享
startPolling
stopPolling
的最佳方式是什么

我的想法是创建一个新文件
utils/backbone.polling.js
(2)。这是个好办法吗


(一)


(二)


您可以扩展集合原型,将公共方法添加到您拥有的每个集合中(如果您确实需要它的话)。在其他情况下,您可以使用此方法创建自己的构造函数(第一种方法)

对于provate方法,您也可以这样做,只需开始它们是带下划线的名称:

_.extend(Backbone.Collection.prototype, {
    _executePolling: function() {},
    _onFetch: function() {}
});    
这种命名方法的方式表明这是一个私有方法

如果您想在模型中使用它们,可以扩展模型原型或创建模型的新构造函数,如上面的示例所示。如果这些函数是相同的(希望不是),则可以提供指向函数的链接,而不是函数本身的链接

var bar = function() {};

_.extend(Backbone.Model.prototype, {
   foo: bar
});

_.extend(Backbone.Collection.prototype, {
   foo: bar
});

因此,当您更改条形图功能时,它将在模型和集合中更改。

您可以扩展集合原型,将公共方法添加到您拥有的每个集合中(如果您在任何地方都真正需要它)。在其他情况下,您可以使用此方法创建自己的构造函数(第一种方法)

对于provate方法,您也可以这样做,只需开始它们是带下划线的名称:

_.extend(Backbone.Collection.prototype, {
    _executePolling: function() {},
    _onFetch: function() {}
});    
这种命名方法的方式表明这是一个私有方法

如果您想在模型中使用它们,可以扩展模型原型或创建模型的新构造函数,如上面的示例所示。如果这些函数是相同的(希望不是),则可以提供指向函数的链接,而不是函数本身的链接

var bar = function() {};

_.extend(Backbone.Model.prototype, {
   foo: bar
});

_.extend(Backbone.Collection.prototype, {
   foo: bar
});

因此,当您更改bar函数时,它将在模型和集合中更改。

对于私有方法,据我所知,我不记得javascript提供了一种将对象中的属性设置为“私有”的方法。我能想到的唯一方法是,使“private”方法只能从它们所使用的方法中使用

startPolling: function () {
  this.polling = true;
  this.minutes = 2;

  var self = this;
  var executePolling = function() {
    // Do something
  };

  var onFetch = function() {
    // Do something
  }; 

  executePolling();
},
但是,通过这种方式,您无法从函数中的函数动态访问对象属性(它们只是在创建时保存状态中的值)(链接到展示这种现象)。如果要访问最新的对象属性值,则必须将函数公开。我认为一个好的约定是只使用一个前导下划线来命名“private”函数,以表示它们是私有的(比如
\u executepoll
\u onFetch

至于最好的分享方式。一个好看的解决方案可以是这样的:

 var WestCoastCustoms= {
   // Declare your stuff here
 };

 var Collection = Backbone.Collection.extend(WestCoastCustoms);
 var Model = Backbone.Model.extend(WestCoastCustoms);
一个实用的小提琴例子


希望这有帮助

对于私有方法,据我所知,我不记得javascript提供了一种在对象中使属性“私有”的方法。我能想到的唯一方法是,使“private”方法只能从它们所使用的方法中使用

startPolling: function () {
  this.polling = true;
  this.minutes = 2;

  var self = this;
  var executePolling = function() {
    // Do something
  };

  var onFetch = function() {
    // Do something
  }; 

  executePolling();
},
但是,通过这种方式,您无法从函数中的函数动态访问对象属性(它们只是在创建时保存状态中的值)(链接到展示这种现象)。如果要访问最新的对象属性值,则必须将函数公开。我认为一个好的约定是只使用一个前导下划线来命名“private”函数,以表示它们是私有的(比如
\u executepoll
\u onFetch

至于最好的分享方式。一个好看的解决方案可以是这样的:

 var WestCoastCustoms= {
   // Declare your stuff here
 };

 var Collection = Backbone.Collection.extend(WestCoastCustoms);
 var Model = Backbone.Model.extend(WestCoastCustoms);
一个实用的小提琴例子


希望这有帮助

尽管@Flops和@jake的方法非常优雅,但一个非常简单的方法可能是拥有一个纯JS-utils库,如:

// code simplified and no tested
App = {};
App.Utils = {};
App.Utils.startPolling: function () {
  this.polling = true;
  this.minutes = 2;
  this.executePolling();
},

var MyCollection = Backbone.Collection.extend({
  startPolling: App.Utils.startPolling;
});

尽管@Flops和@jake的方法非常优雅,但一个非常简单的方法可能是拥有一个纯JS utils库,如:

// code simplified and no tested
App = {};
App.Utils = {};
App.Utils.startPolling: function () {
  this.polling = true;
  this.minutes = 2;
  this.executePolling();
},

var MyCollection = Backbone.Collection.extend({
  startPolling: App.Utils.startPolling;
});