这里是文章模块栏目内容页
js插件化plugin开发的流程attach和register使用详解

js的面向对象开发被运用在前端开发领域处理数据展示非常方便。

例如有一个文章列表功能,封装在articlelist列表类里面,实现列表排序,增删改查管理菜单,

多选文件转存和批量转移目录。这个类功能完善,现在业务需要扩展,希望能列出文章的评论管理

用户点赞和分享的数据管理列表,单独做一个页面,分给其他运营账号进行监控管理;

此时,公用articlelist类实现此页面肯定是好事。那么怎么来实现这个呢?

方法第一种:在articlelist类里面增加if等判断代码,增加传入参数,区别两个页面的显示;

这样可以实现,最后却变得代码繁重,功能不单一,难以维护。

方法第二种,采用插件开发模式,在评论管理列表新建一个commentlist类,在此类里面通过插件plugins

实现对articlelist功能的差异化处理;

这里描述一下js插件的实现方法:

OC.Plugins = {
 /**
  * @type Array.<OC.Plugin>
  */
 _plugins: {},

 /**
  * Register plugin
  *
  * @param {String} targetName app name / class name to hook into
  * @param {OC.Plugin} plugin
  */
 register: function(targetName, plugin) {
  var plugins = this._plugins[targetName];
  if (!plugins) {
   plugins = this._plugins[targetName] = [];
  }
  plugins.push(plugin);
 },

 /**
  * Returns all plugin registered to the given target
  * name / app name / class name.
  *
  * @param {String} targetName app name / class name to hook into
  * @return {Array.<OC.Plugin>} array of plugins
  */
 getPlugins: function(targetName) {
  return this._plugins[targetName] || [];
 },

 /**
  * Call attach() on all plugins registered to the given target name.
  *
  * @param {String} targetName app name / class name
  * @param {Object} object to be extended
  * @param {Object} [options] options
  */
 attach: function(targetName, targetObject, options) {
  var plugins = this.getPlugins(targetName);
  for (var i = 0; i < plugins.length; i++) {
   if (plugins[i].attach) {
    plugins[i].attach(targetObject, options);
   }
  }
 },

 /**
  * Call detach() on all plugins registered to the given target name.
  *
  * @param {String} targetName app name / class name
  * @param {Object} object to be extended
  * @param {Object} [options] options
  */
 detach: function(targetName, targetObject, options) {
  var plugins = this.getPlugins(targetName);
  for (var i = 0; i < plugins.length; i++) {
   if (plugins[i].detach) {
    plugins[i].detach(targetObject, options);
   }
  }
 },

 /**
  * Plugin
  *
  * @todo make this a real class in the future
  * @typedef {Object} OC.Plugin
  *
  * @property {String} name plugin name
  * @property {Function} attach function that will be called when the
  * plugin is attached
  * @property {Function} [detach] function that will be called when the
  * plugin is detached
  */

};

在articlelist对象初始化后,注册一个钩子,可以让其他对象注入插件;

例如: articlelist.init = function(){

    ………………

    OC.Plugins.attach('articlelsit.attach', this);

    ………………

}

然后再commentlist对象实现一个attach 方法:

var commentlist = {

attach: function(articlelist) {

这里拿到了 articlelist 对象的实例,

                 可以对它的方法做 重新,属性覆盖,等待操作;

}

        ……………………

};

把 这个commentlist对象 注册到插件数组,实现 对articlelist的修改;

OC.Plugins.register('articlelsit.attach', commentlist);


这里最后要强调一下这些对象的导入顺序:

 plugins 、articlelist、comentlist 对象这样的顺序实现加载优先级。