如何简单粗暴的编写属于自己的插件

简介:

作为一个刚入行不久的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。对于闭包,过段时间我也会写一篇有关的文章给各位小伙伴作为参考理解的。
文章转载自 开源中国社区 [http://www.oschina.net]
相关文章
|
Kubernetes 数据可视化 数据安全/隐私保护
云服务器CentOS8.2Docker图形化管理工具Portainer安装部署
云服务器CentOS8.2Docker图形化管理工具Portainer安装部署
674 0
云服务器CentOS8.2Docker图形化管理工具Portainer安装部署
|
24天前
|
机器学习/深度学习 文字识别 Java
Python实现PDF图片OCR识别:从原理到实战的全流程解析
本文详解2025年Python实现扫描PDF文本提取的四大OCR方案(Tesseract、EasyOCR、PaddleOCR、OCRmyPDF),涵盖环境配置、图像预处理、核心识别与性能优化,结合财务票据、古籍数字化等实战场景,助力高效构建自动化文档处理系统。
280 0
|
6月前
|
机器学习/深度学习 监控 自动驾驶
《告别低效!Vision Mamba改写图像视频处理规则》
Vision Mamba是一款创新的计算机视觉模型,采用双向状态空间模型(B-SSM)架构,大幅提升视频和图像数据处理的效率与精度。相比传统CNN和ViT,它通过序列化小块处理和时空扫描策略,捕捉全局信息和复杂依赖关系,计算复杂度仅为O(L log L),显著降低计算成本和内存占用。在高分辨率图像和视频处理中,Vision Mamba表现出色,广泛应用于自动驾驶、安防监控和医疗影像分析等领域。尽管尚处初级阶段,其潜力巨大,未来可结合量子计算等技术进一步拓展应用范围,为视觉信息处理带来革命性突破。
223 5
|
4月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
218 1
|
供应链 监控 Java
【开题报告】基于SpringBoot的药店药品管理系统的设计与实现
【开题报告】基于SpringBoot的药店药品管理系统的设计与实现
1148 0
|
设计模式 Oracle 关系型数据库
二十三种设计模式全面解析-适配器模式的妙用:异构数据库和不同版本API的完美兼容!
二十三种设计模式全面解析-适配器模式的妙用:异构数据库和不同版本API的完美兼容!
280 0
|
数据采集 存储 定位技术
ArcGIS校园3D展示图制作详细教程
ArcGIS校园3D展示图制作详细教程
413 0
|
SQL 数据采集 JSON
Pandas入门指南:Python中的数据处理与分析
Python的Pandas库是数据科学领域中非常重要的一个库,它使数据清洗和分析工作变得更快更简单。Pandas结合了NumPy的高性能数组计算功能以及电子表格和关系型数据库(如SQL)的灵活数据处理能力。
|
存储 机器学习/深度学习 人工智能
喜马拉雅基于阿里云机器学习平台PAI-HybridBackend的深度学习模型训练优化实践
喜马拉雅AI云借助阿里云提供的HybridBackend开源框架,实现了其推荐模型在 GPU 上的高效训练。
《低代码开发师-宜搭》电子版下载地址
《低代码开发师-宜搭》电子书
396 0
《低代码开发师-宜搭》电子版下载地址