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

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

月光魔力鸭

2018-08-28 19:45 阅读 642 喜欢 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


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
业务中有一段涉及到处理canvas的图片然后将内容进行上传,后测试发现在IE中不好使哎...
我们经常会有判断一个数值是素数的需求,那么我们如何来实现呢?
在我们web开发过程中经常会碰到针对table的一些dom操作,这里整理一下关于这方面的知识点。当然我们可以通过jquery这样的插件来处理,或许会更简单一些,不过现在简单说下原生JS是如何操作的
在我们通过canvs画图的时候经常会用到圆,且需要计算出圆上某点的坐标,由于我数学没学好,总是记不得怎么获取,这里记录下,加深记忆
在开发过程中多个页面使用的一个小工具类,简单完善了下,还算不错,给各位提供下小思路。
现象:在IOS中,jsp页面绑定的点击事件,点击后延迟很大,接近1000ms,反应很慢
我们有时候会拿textarea来做编辑器,但是常用编辑器都是支持tab缩进的,这里对textarea监听下事件处理下即可实现。
前端时间搞了个小转码,放在后台,但是特别占带宽,想着能不能从前台把这个事搞定呢?读取图片的二进制,然后将字节流处理后重新生成图片展示处理啊。