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

简介: 作为一个刚入行不久的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 

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


目录
相关文章
|
3月前
|
前端开发 数据可视化 数据挖掘
前端开发者的福音:这些插件让你轻松应对各种复杂需求!
前端开发领域充满创意与挑战,面对复杂需求,开发者常感力不从心。本文通过三个真实案例,介绍如何利用Chart.js、ESLint和Ant Design等强大插件,解决数据可视化、代码质量和UI组件复用等问题,提高开发效率,创造更出色的前端作品。
47 3
|
4月前
|
资源调度 前端开发 安全
前端实战:基于Verdaccio搭建私有npm仓库,轻松上传与下载自定义npm插件包
前端实战:基于Verdaccio搭建私有npm仓库,轻松上传与下载自定义npm插件包
228 0
|
4月前
|
前端开发 JavaScript
乾坤qiankun(微前端)样式隔离解决方案--使用插件替换前缀
乾坤qiankun(微前端)样式隔离解决方案--使用插件替换前缀
765 8
|
4月前
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
571 0
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
5月前
|
运维 前端开发
前端使用antdesign导出插件跨域问题
前端使用antdesign导出插件跨域问题
69 1
|
6月前
|
前端开发 安全 测试技术
[译]一种基于模块联邦的插件前端
[译]一种基于模块联邦的插件前端
|
6月前
|
Web App开发 前端开发 JavaScript
灵魂拷问-前端的作用--chrome插件篇
本文会从浏览器插件应用场景切入,穿插插件基础能力和常见入口的介绍,核心回答如下三个问题:插件可以被使用在哪些场景?不同的使用场景我们的主要代码实现思路是怎样的?我们可以从哪些角度入手自己开发一款可以落地实用的浏览器插件?
|
6月前
|
前端开发 开发者
在前端开发中,webpack 作为模块打包工具,其 DefinePlugin 插件可在编译时动态定义全局变量,支持环境变量定义、配置参数动态化及条件编译等功能。
在前端开发中,webpack 作为模块打包工具,其 DefinePlugin 插件可在编译时动态定义全局变量,支持环境变量定义、配置参数动态化及条件编译等功能。本文阐述 DefinePlugin 的原理、用法及案例,包括安装配置、具体示例(如动态加载资源、配置接口地址)和注意事项,帮助开发者更好地利用此插件优化项目。
189 0
|
7月前
|
前端开发 JavaScript API
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(下)
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(下)
70 0
|
7月前
|
监控 JavaScript 前端开发
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(上)
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(上)
68 0

热门文章

最新文章

  • 1
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 4
    详解智能编码在前端研发的创新应用
  • 5
    巧用通义灵码,提升前端研发效率
  • 6
    智能编码在前端研发的创新应用
  • 7
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 8
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 9
    抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
  • 10
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
  • 1
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
    29
  • 2
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
    51
  • 3
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 4
    巧用通义灵码,提升前端研发效率
    93
  • 5
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    141
  • 6
    详解智能编码在前端研发的创新应用
    96
  • 7
    智能编码在前端研发的创新应用
    83
  • 8
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    37
  • 9
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    121
  • 10
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    75