慢板

前段时间急于试一试看jQuery的源标识符,刚开体形就夹住了。不管怎样都认知没法jQuery源标识符出口处部份中的

return new jQuery.fn.init( selector, context )

看了好些回帖都没看懂,真的他们蠢,心中很苦,过夜都不香了。昨天去划船,游完8*100后靠在池壁泄气,没人从我旁起程,水雾溅起的一瞬间,我忽然,圣埃蒂安德了!这约莫就是苟延残喘 (加到)福至心灵吧! 下面一点儿地说下我对jQuery出口处源标识符的认知。

自继续执行的非官方表达式

jQuery源标识符最内层的内部结构如下表所示:

自动草稿

任何人库的导入都得努力做到不环境污染全局表达式,得有他们的重新命名外部空间。下面的自继续执行非官方表达式就能努力做到这两点,把大部份库专有的表达式和方式,都Angular两个专有的外部空间内,容许外间出访的特性或方式能装载到window上。

比如下表所示面这段标识符:

自动草稿

外部表述的count表达式以及addOne方式,宏观经济环境下是无法出访到的,但在window上装载两个方式outerAddOne,对准addOne,外间就能出访到了。

OK,介绍了那个自继续执行非官方表达式的促进作用,这儿还有三个问题。

第三,为何要传至window?

看了下面的outerAddOne那个范例,就会辨认出,不传至window也无所谓嘛,就算能把方式拉到window头上啊。 三个其原因:

具体来说,从标识符填充混为一谈的视角考量。

我们绞索上辅助工具来填充混为一谈下面这段示例标识符:

自动草稿

压完混瘤果瘦了一点:

自动草稿

看到没有,用a代替了name,但window既不是声明的局部表达式也不是参数,是不会被填充混为一谈的,所以将window作为参数传至可解决那个问题。

其次,传至window参数,就能不用沿着促进作用域链一层层向上查找直到顶层促进作用域去获取window对象了,出访更快了。

第二,为何要传至undefined?

undefined并不是JS中的关键字,在IE8及以下中是能对其重新赋值的。

自动草稿

在参数列表中给出undefined参数,但不传至值,那么那个参数值就是undefined值了。

jQuery对象的构建

先看jQuery源标识符中如何对jQuery赋值的:

自动草稿

我就是被new jQuery.fn.init()这儿弄晕了,先在这儿暂停,回想一下平常我是如何使用jQuery的(\$即对应‘jQuery):

自动草稿

要实现这两种调用,\$(body)应该是两个实例对象,css是每个实例共享的方式,是原型上的方式。而\$则是两个类,parseJSON则是类的静态方式。 接下来,我们试着往那个结果上靠。

如何不用new关键字得到jQuery对象?

回想一下平常我都是怎么构建实例对象的,通常我会这样写两个Prince类:

自动草稿

然后我会这样去获取两个Prince实例对象:

自动草稿

如果我年纪大了忘记用new关键字了,程序就报错了:

自动草稿

除了调用方式会出错之外,window还被装载了三个表达式上去,何其无辜。

但获取jQuery对象(以下简称JQ对象)用new和不用new都能,返回的是一样样的。

自动草稿

为了努力做到这两点,我们很容易想到需要在构造表达式外部返回对象。引用下我在另一篇博文JavaScript中的普通表达式与构造表达式里写的:

构造表达式有return值怎么办? 构造表达式里没有显式调用return时,默认是返回this对象,也就是新创建的实例对象。 当构造表达式里调用return时,分两种情况: 1.return的是五种简单数据类型:String,Number,Boolean,Null,Undefined。

这种情况下,忽视return值,依然返回this对象。 2.return的是Object

这种情况下,不再返回this对象,而是返回return语句的返回值。

所以我们应该在jQuery构造表达式外部去返回两个对象,这样就能不用new的方式去创建JQ对象了,其实这时候,构造表达式就相当于两个工厂表达式了。 那么核心问题来了。

该返回什么样的对象?对于那个对象有何要求?

那个对象必须能调用jQuery.prototype上的方式。

我们使用或他们写jQuery插件的时候会经常遇到\$.fn那个对象,很多插件都是通过扩展那个对象来实现的。 \$.fn其实对应着jQuery.prototype,\$和fn分别是jQuery和prototype的简写方式,只要我们把方式扩展到那个原型对象头上,通过\$()获取的JQ对象都是能出访到方式的。 比如:

自动草稿

所以,工厂表达式外部返回的对象一定要能调用jQuery.prototype上的方式。

是时候看John Resig到底是怎么做的啦。

jQuery源标识符

自动草稿

在chrome里调试时候添加JQ对象的watch,会看到类似如下表所示的结果:

自动草稿

看到下面这段源标识符,其原因就很明显了,其实我们所说的JQ对象根本就是init表达式的实例对象,而init则是jQuery原型上的两个对象,它本身是没有什么方式的,全靠从jQuery原型上拿。

“jQuery.fn.init.prototype = jQuery.fn”这句很重要,它将init的原型对准jQuery的原型,所以JQ对象才能出访‘css、show、hide这些写在jQuery.fn上的方式。

我们可能会有疑问,为何要从init这绕这么一大圈来出访jQuery的原型,而不是直接返回两个jQuery实例直接通过那个实例来出访自身原型?比如说标识符能写成这样:

自动草稿

问题很明显,这样做只会大家一起死,死在循环里。

好,那我接受init的存在,但我这样写难道不能吗?

自动草稿

让我们做点动作来证明加上new是有用的。

自动草稿

下面这段标识符是为了说明this的促进作用域问题,其不仅能出访init表达式外部,还能向上一层到fn对象。我听人家说,做框架的,促进作用域要独立才好呢。 给它加上new关键字:

自动草稿

这样this的促进作用域就独立出来了。

有任何人不妥之处或错误欢迎各位指出,不胜感激~

题外话

经常看别人的博客,有些表述方式实在独特而有趣,每每读来都觉妙趣横生,哑然失笑。不禁心生羡慕,技术过硬,知识面广还写得一手好文章,赞! 想起在学校时每次我们做presentation,上台第三句,大家好,我今天讲的题目是……,然后幻灯片一页页划过去,历史背景,研究现状,我使用的方式……导师都听得一脸崩溃,nonono,不要,不要这样,你们这样讲,不会没人有耐心听下去的……我们要像说故事一样娓娓道来,抓住听众的注意力,一点儿导入……于是以后我都尽量按照说故事那个思路去讲,最后毕业答辩的时候,两个老师说,为何我真的你像故宫导览哈哈哈哈…… 果然还是没有掌握表述的技巧啊。

1.本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!