你尚未登录,仅允许查看本站部分内容。请登录使用邀请码注册
二哲|风变科技

可想造一个属于你自己的jQuery库?(一) 11个回复 专栏 @ 框架与库

二哲|风变科技 发布于 2 年前

前言

1.虽然说市面上有许多讲解jQuery源码或者是也有类似如何搭建一个属于自己的javascript库的文章。
2.但毕竟更多数人的水平并没有达到单纯看源码解析就能读懂jQuery
3.如果你既不能通过书籍视频和他人文章的源码解析明白jQuery,也想自己实现一个jQuery的。
4.本系列就是以一些不同的方法手段,简单的代码,实现了一套与jQuery一样的API
5.最后在每篇文章的最后会留下github源码地址,希望能得到大家star的认可与支持,谢谢。

Lesson-0


首先第一个版本,我们要先了解搭建一个库或者是一个给别人使用的小插件应该用一种什么样的格式.

首先我们需要创建一个闭包

(function() {
    //code..
})();

然后将我们所需要的代码和逻辑都写在里面避免全局变量的泛滥.

接着我们来看看我们第一版里的代码.

(function(window,document) {
    var w = window,
        doc = document;
    var Kodo = function(selector) {
        return new Kodo.prototype.init(selector);
    }
    Kodo.prototype = {
        constructor : Kodo,
        length : 0,
        splice: [].splice,
        selector : '',
        init : function(selector) {//dom选择的一些判断

        }
    }
    Kodo.prototype.init.prototype = Kodo.prototype;

    Kodo.ajax = function() { //直接挂载方法  可k.ajax调用
        console.log(this);
    }

    window.f = Kodo;
})(window,document);

我创建了一个闭包,传入了window,document并且在内部将他们缓存起来.

接着

var kodo = function(selector) {
    return new Kodo.prototype.init(selector);
}

如果有看过jQuery源码的童鞋对这个真是在了解不过了.每次用kodo调用的时候,将直接 返回一个kodo的实例.达到无new调用的效果

Kodo.prototype = {
    constructor : Kodo,
    length : 0,
    splice: [].splice,
    selector : '',
    init : function(selector) {//dom选择的一些判断

    }
}
Kodo.prototype.init.prototype = Kodo.prototype;

接着重点就在于如何去构造Kodo的prototype的原型了.在这上面的属性也就相当于是jQuery的实例方法和属性.所以每次$()后都能链式调用.

由于我们是return new Kodo.prototype.init,那自然,我们需要手动的把init的prototype指向Kodo的prototype

同时我们在原型上具有splice属性后,我们的对象就会变为了一个类数组对象,神奇吧!

Kodo.ajax = function() { //直接挂载方法  可f.ajax调用
    console.log(this);
}

由于javascript中一切皆对象,所以我们能在我们的Kodo上直接用.XXX来赋予新的属性和方法,这样的方法也被称之为静态方法.

window.f = Kodo;

最后我们在window上对外暴露一个接口,我们就可以愉快的用 f.ajax 或者是 f("#id")即可调用.

github:https://github.com/MeCKodo/forchange/tree/master/lesson-0

版权声明:自由转载-非商用-非衍生-保持署名

  • ro87630872

    你的github 上有些内容不错,.嘿嘿

    #1
  • zoumm

    不错,收藏了

    #2
  • 二哲|风变科技

    @zoumm 谢谢 : )

    #3
  • 二哲|风变科技

    @ro87630872 谢谢 :)

    #4
  • HapLeo

    不错。还没看过jQuery源码解析之类的,只是大概扫过一眼jq的代码结构。正适合我这样的小白学习。已star。

    #5
  • hujiaqi

    赞啊

    #6
  • claypot

    有此想法,现在有些模块依赖jq太笨重了; 上面说的先创建闭包的代码好像写错了,正确应该是这样吧:

    (function(){
        //code..
    })();
    
    #7
  • null

    @claypot 确实是写错了,估计是作者不小心

    #8
  • 刀洒温柔

    不错。

    #9
  • Yeahs

    很不错的想法,给个赞

    #10
  • chennengbao

    return new Kodo.prototype.init(selector); 为什么要用原型的方法来进行实例化,目的是什么呀?

    #11
登录后回复,如无账号,请使用邀请码注册