我对jquery框架中核心部分的理解

我对jquery框架中核心部分的理解

月光魔力鸭

2018-08-28 19:45 阅读 665 喜欢 0 jquery框架 理解jquery

jQuery 整体构造


jquery的特点就是无new构造和链式调用。

$('xxx')
$('xxx').css().attr().val();

正常的情况下应该是:

function aQuery () {
    this.name='test';
    return this;
}
console.log(new aQuery());
aquery{
    name : 'test',
    __proto__ : Object
}

如果不需要new的话,就应该在函数体内实例化。

function aQuery () {
    
    return new aQuery();//但是这样就死循环了...
}

还需要一个构造函数来进行构造:

function aQuery () {
    return new aQuery.prototype.init();
}
aQuery.prototype = {
    init : function(){
        return this;
    },
    test :function () {
        console.log('test');
    }
}
//但是这样构造的实例是init,而不是aQuery,无法访问aQuery的原型方法。
//增加一个原型指向
aQuery.prototype.init.prototype = aQuery.prototype;
//这样就可以访问aQuery的原型方法test了。
aQuery().test();

那么如何进行链式调用呢?只需要在每个函数都返回this即可。

function aQuery () {
    return new aQuery.prototype.init();
}
aQuery.prototype = {
    init : function(){
        return this;
    },
    test :function () {
        console.log('test');
        return this;
    },
    add : function(){
        //xxx
        return this;
    }
}
//这样就可以链式调用了
aQuery().test().add();//但是有个缺点,函数都没有确切的返回值。

链式调用只适用于某种特殊情况。 同时还想增加静态方法要如何来做呢?且看 extend

//我们需要提供一个接口,来增加aQuery的原型方法和静态方法。
aQuery.extend = aQuery.prototype.extend = function(object){
//虽然两个函数都指向了一个,但是可以通过this来改变
    var target = this;
    for(var key in object){
        garget[key] = object[key];
    }
    return target;//一定要返回修改后的this
};
//这样我们就可以通过extend接口增加原型函数和静态函数了
aQuery.extend({
    add : function(){
        console.log('add');
    }
});
aQuery.prototype.extend({
    add2 : function(){
        console.log('add2');
        return this;
    }
});
//可以直接调用静态函数
aQuery.add();
//可以矫勇原型函数
aQuery().add2().test();

下面是一个简单的jquery构造的实现:

'use strict';
(function(window,undefined){	
    var SchoolSelect = function(params){
        return new SchoolSelect.fn.init(params);
    };
    SchoolSelect.fn = SchoolSelect.prototype = {
            constructor : SchoolSelect,
            init : function(params){
                this.cfg = params;
                return this;
            },
            version : '1.0'
    };
    SchoolSelect.fn.init.prototype = SchoolSelect.fn;
    SchoolSelect.extend = SchoolSelect.fn.extend = function(obj) {
        var target = this;
        for(var k in obj){
            target[k] = obj[k];
        }
        return target;
    };
    SchoolSelect.extend({
        add : function(){
            console.log('aaa');
        },
        age : 11
    });
    SchoolSelect.fn.extend({
        abc : function(){
            console.log('bbb');
            return 'aaccc';
        }
    });
    window.SchoolSelect = SchoolSelect;
})(window);

转载请注明出处: https://chrunlee.cn/article/jquery-personal-explain.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
突然来了一个调研任务,想要实现一个类似3D虚拟展厅类似的需求,主要就是放一些学生的作品,然后预览啥的,效果还是要全景的效果。 经过一番调查,最终锁定了以前从未接触过的krpano。
在我们web开发过程中经常会碰到针对table的一些dom操作,这里整理一下关于这方面的知识点。当然我们可以通过jquery这样的插件来处理,或许会更简单一些,不过现在简单说下原生JS是如何操作的
在文件上传的时候,经常会对文件的mime进行限制,比如图片 image/jpg 等,让用户可以选择图片,而不是其他的文件。
开发的项目中有使用到微信开发,由于之前偶尔才用一次,也是用的别人的地址和测试号,这里记录下自己的操作。防止后续遗忘。
如何通过js调用本地摄像头呢?获取后如何对视频进行截图呢?在这里跟大家做一个简易的Demo来实现以上几个功能。
之前一直没面试过前端,今天有一个,先整理下需要问的问题和答案。这里都是一些简单的问题,关于当下比较流行的框架并没有涉及到..
需求如下:有一张大图,需要显示大图中的一小部分,目前能知道的时候小图的宽高和坐标,同时大图有一个旋转角度可以知道,目标就是把小图正确的显示出来。
在我们通过canvs画图的时候经常会用到圆,且需要计算出圆上某点的坐标,由于我数学没学好,总是记不得怎么获取,这里记录下,加深记忆