博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jquery核心
阅读量:5223 次
发布时间:2019-06-14

本文共 2634 字,大约阅读时间需要 8 分钟。

1.当我们想要创建一个对象,我们可能使用new方法去构建一个对象,那按道理jquery也是一个对象,应该也是用new jquery()来构建呀为什么我们创建jquery对象不用new jquery()而是直接使用类似$(ele)的方式去构建出来一个jquery对象呢?其实内部还是使用了new来构建的,只是jquery内部帮我们构建了而已,请看下面代码

function Jquery() {        return new Jquery();    }    Jquery.prototype = {        version:'1.01'    }

直接这样内部使用new来构建Jquery,很明显是有问题的,这样的话就形成了死循环。为了解决死循环的问题,请看下面代码:

function Jquery(selector, context) {    return Jquery.prototype.init(selector, context);}Jquery.prototype = {    version:'1.01',    init: function () {        this.name = "lin";        return this;    }}var a = Jquery();var b = Jquery();console.log(a.version); //1.01console.log(a.name);   //lina.name = "na";console.log(b.name);  //na

2.死循环的问题确实解决了,但是又发现了新的问题,可以看到a和b两个对象的属性是公用的,我修改a.name属性为na,b.name属性也跟着变为了na,其原因就是this都是指向Jquery的为了解决这个问题,我们可以每次调用Jquery()的时候都构建一个新的对象,改进代码如下:

function Jquery() {    return new Jquery.prototype.init(); //注意看,这里多了个new}Jquery.prototype = {    version:'1.01',    init: function () {        this.name = "lin";        console.log(this);        return this;    }}var a = Jquery();var b = Jquery();console.log(a.version); //undefinedconsole.log(a.name);   //lina.name = "na";console.log(b.name);  //lin

3.这样处理之后,属性共享的问题已经解决了,每个对象都有各自的属性,可以自由修改,每个对象互不影响,但是又又又发现了新的问题,可以看到我们控制台打印a.version这个属性的时候是读取不到这个属性的,原因就在于此时Jquery.prototype和Jquery.prototype.init.prototype是互不相干的,我们创建的是Jquery.prototype.init对象,所以只能读到Jquery.prototype.init.prototype上的属性而读取不到Jquery.prototype上的属性的(该例指version这个属性),解决办法很简单,就是把Jquery.prototype赋值给Jquery.prototype.init.prototype,这样就相当于把Jquery原型上的属性全部赋值到了Jquery.init的原型上,请看下面代码:

function Jquery(selector, context) {    return new Jquery.prototype.init(selector, context);}Jquery.prototype = {    version:'1.01',    init: function () {        this.name = "lin";        return this;    }}/*为了init可以调用jQuery的方法,所以把init的原型改为jQuery的原型*/Jquery.prototype.init.prototype = Jquery.prototype;  var a = Jquery();var b = Jquery();console.log(a.version); //1.01console.log(a.name);   //lina.name = "na";console.log(b.name);  //lin

 ps:官方写法

(function (window, undefined) {    var jQuery = function() {        return new jQuery.prototype.init();    }    wjQuery.prototype = {        //手动修改构造器的指向        constructor: jQuery,        init: function(){
} } /*为了init可以调用wjQuery的方法,所以把init的原型改为wjQuery的原型*/ jQuery.prototype.init.prototype = jQuery.prototype;   /*给window暴露后那么全局都可以直接使用了jQuery和$了*/ window.wjQuery = window.$ = jQuery;})(window);
  • 闭包结构传参window
    • 闭包结构传入实参window,然后里面用形参接收
      • 减少内部每次引用window的查询时间
      • 方便压缩代码
  • 形参undefined
    • 因为ie低版本的浏览器可以给undefined赋值成功,所以为了保证undefined的纯洁给它一个形参的位置而没有实参,保证了它一定是undefined

转载于:https://www.cnblogs.com/kinblog/p/11519375.html

你可能感兴趣的文章
centos7升级firefox的flash插件
查看>>
jmeter系列二(jmeter engine相关)
查看>>
一份超全超详细的 ADB 用法大全
查看>>
WebView 调试
查看>>
IB使用
查看>>
Apache Common-IO 使用
查看>>
apidoc
查看>>
关于 ++x 和 x++ 比较难的一个例子
查看>>
第三次作业 105032014021
查看>>
记录一些容易忘记的属性 -- UILabel
查看>>
STL之map UVa156
查看>>
再谈Vmware NAT的配置和路由流程
查看>>
javaScript数组去重方法汇总
查看>>
评价意见整合
查看>>
二、create-react-app自定义配置
查看>>
Android PullToRefreshExpandableListView的点击事件
查看>>
系统的横向结构(AOP)
查看>>
linux常用命令
查看>>
NHibernate.3.0.Cookbook第四章第6节的翻译
查看>>
例1-1
查看>>