一入前端深似海,从此红尘是路人系列第二弹之如何简单粗暴的编写出一个属于自己的插件

简介: 作为一个刚入行不久的web前端工程师,虽然经验不多,但是基于本人的性格,有自己掌握的并且认为比较好玩比较高大上的东西当然是要献给大家的。此博客发表后也希望可以帮到一些还在为插件编写徘徊的兄弟们。

作为一个刚入行不久的web前端工程师,虽然经验不多,但是基于本人的性格,有自己掌握的并且认为比较好玩比较高大上的东西当然是要献给大家的。此博客发表后也希望可以帮到一些还在为插件编写徘徊的兄弟们。

1、首先先来一段我自己项目开发中最喜欢的插件的写法,也是一个比较经典的jQuery插件写法。


//闭包限定命名空间
;(function($,doc,win){
var Plugins = function(options){
  this.setting = {
	//这里是插件中各种参数,各种属性配置
	pluginsID: '',
	alertHtml: ''
  };
  /**
   * 这里如果有懂JavaScript设计模式的朋友们应该知道
   * 这是比较常见的适配器模式,通过适配器来适配传入的参数
   */
  for(var i in this.setting){
	this.setting[i] = options[i] || this.setting[i];
  }
  //或者通过$.extend(this.setting,options)进行适配,不过这样可能会多添加属性,小伙伴们可以自行去测试

  //调用插件方法
  this.init();
}
Plugins.prototype = {
  myFn: function(){
	var self = this;
	$(self.setting.pluginsID).click(function(){
	  alert(self.setting.alertHtml);
	})
  },
  init: function(){
    //定义变量self保存this,避免this指向偏移
	var self = this;
	self.myFn();
  }
};
//将编写好的插件暴露出去
window['Plugins'] = Plugins;

})(jQuery,document,window);

对于为什么会在代码最前面加上一个";",这个也是为了避免后期因为利用 grunt,gulp等构建工具进行代码的压缩打包产生的不必要的冲突。插件调用方法如下:


$(function(){
  //插件的调用
  new Plugins({
	pluginsID: '#plugins',
	alertHtml: '欢迎来到插件世界'
  });
})

2、接下来给大家分享一下jQuery官方提供的一个标准化的开发模式


;(function($){
  $.fn.plugins = function(options){
    var setting = {
      //各种参数,各种属性
    }
    var options = $.extend(setting,options);

    this.each(function(){
      //各种功能
      //定义变量self保存当前对象
      var self = $(this);
      self.find(options.pluginsID).click(function(){
        alert(options.alertHtml);
      });
    });
        
    // 返回当前对象,可以在插件调用的同时进行链式操作
	return this;
  }

})(jQuery);

调用方法如下:


$(function(){
  //插件的调用
  $('body').plugins({
	pluginsID: '#plugins',
	alertHtml: '欢迎来到插件世界'
  });
})

那么上面的 return this怎么进行链式操作呢?操作也是相当的简单,具体操作如下:


$(function(){
  //return this将插件的调用对象$('body')重新返回了回去,因此只需要在插件调用后进行链式操作即可
  $('body').plugins({
	pluginsID: '#plugins',
	alertHtml: '欢迎来到插件世界'
  }).find('#plugins').css({background:'red'});
})

怎么样,这种操作是不是很方便。

3.原生JavaScript插件开发。


;(function(doc,win){
var Plugins = function(options) {  
  this.setting = {
    pluginsID: '',
    alertHtml: ''
  };
  for(var i in this.setting){
    this.setting[i] = options[i] || this.setting[i];
  }
  this.init();
};  
// 通过单例模式抽象JavaScript一些属性样式方法
Plugins.prototype = {  
  g: function(id){
	return document.getElementById(id);
  },
  on: function(id,type,fn){
	this.g(id)['on'+type] = fn;
  },
  init: function(){
	var self = this;
	self.on(self.setting.pluginsID,'click',function(){
	  alert(self.setting.alertHtml)
	})
  }
};
window['Plugins'] = Plugins;
})();

调用方法如下:


new Plugins({
  pluginsID: 'plugins',
  alertHtml: '欢迎来到插件世界'
});

以上原生JavaScript插件的开发是不是和前面的两种十分的相似,因为他们都是通过原型模式进行插件的中的继承从而实现插件的功能。还有一种原生JavaScript插件的开发便是动态原型模式进行开发,话不多说,直接上code。


;(function(doc,win){
var Plugins = function(options) {  
  this.setting = {
    pluginsID: '',
    alertHtml: ''
  };
  for(var i in this.setting){
    this.setting[i] = options[i] || this.setting[i];
  }
  // 使用必要条件进行检测,然后再往其原型中添加函数。  
  if(typeof this.NULL != "function") {  
    // 缓存Plugins.prototype
    var proto = Plugins.prototype;  
    // 抽象获取元素id方法
    proto.g = function(id){
	  return document.getElementById(id);
	},
	// 抽象元素绑定事件
	proto.on = function(id,type,fn){
      this.g(id)['on'+type] = fn;
	},
	proto.init = function(){
	  var self = this;
	  self.on(self.setting.pluginsID,'click',function(){
		alert(self.setting.alertHtml)
	  })
	}
  }  
}; 
window['Plugins'] = Plugins;
})();

调用方法如下:


new Plugins({
  pluginsID: 'plugins',
  alertHtml: '欢迎来到插件世界'
}).init();

以上几种便是我知道的一些常见插件的编写方式,相信各位小伙伴们看完对插件的开发也有了一定的了解。当然对于插件开发,其中最重要的就是继承和闭包了。对于继承这里我就不多说了,可以参考我另外一篇文章https://my.oschina.net/qiangdada/blog/745061。对于闭包,过段时间我也会写一篇有关的文章给各位小伙伴作为参考理解的。

小伙伴们,看完这篇文章后你有没有找到属于自己的那款简单粗暴的插件开发形式呢?

原文发布时间为:2016年09月16日
原文作者:qiangdada 

本文来源:开源中国 如需转载请联系原作者


目录
相关文章
|
13天前
|
前端开发 数据可视化 数据挖掘
前端开发者的福音:这些插件让你轻松应对各种复杂需求!
前端开发领域充满创意与挑战,面对复杂需求,开发者常感力不从心。本文通过三个真实案例,介绍如何利用Chart.js、ESLint和Ant Design等强大插件,解决数据可视化、代码质量和UI组件复用等问题,提高开发效率,创造更出色的前端作品。
20 3
|
1月前
|
前端开发 JavaScript
乾坤qiankun(微前端)样式隔离解决方案--使用插件替换前缀
乾坤qiankun(微前端)样式隔离解决方案--使用插件替换前缀
349 8
|
1月前
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
146 0
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
1月前
|
资源调度 前端开发 安全
前端实战:基于Verdaccio搭建私有npm仓库,轻松上传与下载自定义npm插件包
前端实战:基于Verdaccio搭建私有npm仓库,轻松上传与下载自定义npm插件包
87 0
|
2月前
|
运维 前端开发
前端使用antdesign导出插件跨域问题
前端使用antdesign导出插件跨域问题
36 1
|
3月前
|
前端开发 安全 测试技术
[译]一种基于模块联邦的插件前端
[译]一种基于模块联邦的插件前端
|
3月前
|
前端开发 开发者
在前端开发中,webpack 作为模块打包工具,其 DefinePlugin 插件可在编译时动态定义全局变量,支持环境变量定义、配置参数动态化及条件编译等功能。
在前端开发中,webpack 作为模块打包工具,其 DefinePlugin 插件可在编译时动态定义全局变量,支持环境变量定义、配置参数动态化及条件编译等功能。本文阐述 DefinePlugin 的原理、用法及案例,包括安装配置、具体示例(如动态加载资源、配置接口地址)和注意事项,帮助开发者更好地利用此插件优化项目。
97 0
|
5月前
|
传感器 前端开发 JavaScript
前端开发者必备的VS Code插件推荐
前端开发者必备的VS Code插件推荐
|
4月前
|
前端开发 JavaScript API
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(下)
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(下)
53 0
|
4月前
|
监控 JavaScript 前端开发
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(上)
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(上)
53 0
下一篇
无影云桌面