HomeGithub个人博客Weibo订阅

如何设计一个支持方法链式调用的JavaScript库

  Barret李靖  阅读(396)  评论(0编辑  收藏  举报

本文从ITeye导入

 

可以先了解下 javascript链式调用的实现方式

 

复制代码
//设计一个支持方法链式调用的JavaScript库

/*
    常见于大多数JavaScript库中的特性
 ————————————————————————————————————————————————————————————————————
       特性          |                       说明
 ————————————————————————————————————————————————————————————————————
       事件          |   添加和删除事件监听器,对时间对象进行规范内化处理
       DOM          |   类名管理,样式管理
       Ajax         |   多XMLHttpRequest进行规范化处理
 ————————————————————————————————————————————————————————————————————

    注:可以对私有的_$构造函数进行扩充
*/
Function.prototype.method = function(name, fn){
    this.prototype[name] = fn;
    return this;
};

(function(){

    function _$(els){
        this.element = [];
        for(var i = 0, len = els.length; i < len; i++){
            var element = els[i];
            if(typeof element === 'string'){
                element = document.getElementById(element);
            }
            this.element.push(element);
        }
        return this;
    }

    /*
        Events
            * addEvent
    */

    _$.method('addEvent', function(type, fn){
            var add = function(el){
            if(window.addEventListener){
                el.addEventListener(type, fn, false);
            }else if(window.attachEvent){
                el.attachEvent('on' + type, fn);
            }
            this.each(function(el){
                add(el);
            });
        }).

    /*
        otherFun
            * each
            * setStyle
            * show
    */

        method('otherFun', function(fn){
            for(var i = 0, len = this.element.length; i < len; i++){
                fn.call(this, this.element[i]);
            }
            return this;
        }).
        method('setStyle', function(prop, val){
            this.each(function(el){
                el.style[prop] = val;
            });
            return this;
        }).
        method('show', function(){
            var that = this;
            this.each(function(el){
                that.setStyle('display', 'none');
            });
            return this;
        });

    window.installHelper = function(scope, interface){
        scope[interface] = function(){
            return new _$(arguments);
        };
    };
})();

/*
    //处理库中$的冲突问题

    用户可能会这样使用:
    installHelper(window, "$");

    $('example').show();

    也可以将功能添加到实现定义好的命名空间对象中:
    window.com = window.com || {};
    com.example = com.example || {};
    com.example.util = com.example.util || {};

    installHelper(com.example.util, '$');
    (function(){
        var get = com.example.util.get;
        get('example').show();
    })();
*/
复制代码

 

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示