jquery美元背后的一点小技巧

1、如
【菜科解读】
在Jquery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg') 的写法。
1、如何给一个id为casper的标签添加一个名为“world”的class
考虑下面一个场景,假设我们页面上有个id为casper的div标签,如下所示
casper是个大傻瓜,啦啦啦啦啦现在我们想要给它添加一个class,比如“world”,用jquery的话如何实现?很简单,不卖关子
$('#casper').addClass('world');很好,接下来我们思考:如何不用jquery,我们如何如何实现实现上述功能?最简单的方式:
var node = document.getElementById('casper');node.className += ' world';getElementById、getElementsByTagName神马的,名字老长老长的,写着有点不爽,于是把getElementById这个方法用美元($)包装下:
function $(id){ return document.getElementById(id);$('casper').className += ' world';className品字符串神马的,jquery的调用方式相比麻烦多了,那再改进下:
function $(id){
var node = document.getElementById(id); node.addClass = function(addName){ node.className += ' ' + addName; return document.getElementById(id);$('casper').addClass('world');看上去挺像那么一回事了,多优雅的接口啊(热泪盈眶中)~
真的是这样吗,再仔细瞧瞧?于是果断发现不对劲的地方:对于$,每次调用,都会给返回的dom元素上添加一个addClass方法,这对空间来说是极大的浪费。
当然,可以将addClass方法抽取出来:
function addClass(className){
//实现略function $(id){ var node = document.getElementById(id); node.addClass = addClass; return document.getElementById(id);$('casper').addClass('world');原先的空间浪费问题可以在很大程度上得到解决,但明显这解决方法还不够好。
如果有那么一种实现方式,让所有的对象实例都共享一个方法。
。
。
2、jQuery中的实现思路
同样不必卖关子,这里说的就是原型方法,我们再看下jquery的调用方式
$('#casper').addClass('world');$('#casper')并不是像我们上面那样,简单地将id为casper的元素返回。
实际上,$('#casper')返回的是一个jQuery对象,该对象特征如下:
拥有一个length属性,length等于你调用$选中的元素的数目,在$('#casper')中为1
拥有0~n-1的实例属性,分别对应调用$时选中的第1~第n个元素,如本例中$('#casper')[0]即为目标dom元素
拥有一堆原型方法,如常见的addClass、removeClass、bind等
根据上面三点,很容易对我们之前写的代码进行修改,如下:
function $(id){
this[0] = document.getElementById(id); this.length = 1;$.prototype.addClass = function(className){ this[0].className += ' ' + className;var noode = new $('casper');node.addClass('world');其实就几行代码的事情,但。
。
。
还是觉得有些不对劲,new $('casper'),平常在用jquery的时候似乎不需要new一下的说,想想看,我们代码中一坨new是多么可怕的事情~
好吧,其实是因为jQuery帮你完成了构造函数调用的这部分工作,这一小小的细节改善对jQuery的流行起到了很大的帮助。
按照这个思路,继续修改之前的代码:
function $(id){
if(!(this instanceof $) return new $(id); //加了这么个语句 this[0] = document.getElementById(id); this.length = 1;//其他一样,节省空间不贴代码在上面的代码中,只有一点小小的修改,就是加了个判断语句 if(!(this instanceof $)) ,作用在于判断,当$被调用时,究竟是采用以下两种调用方式的哪一种,关于这种判断方式,可参考之前写的《【经验总结】构造函数的强制调用》:
$('casper'),直接调用,于是this为window
new $('casper'),此时$为构造方法,this instanceof $ == true
3、jQuery中的源码实现以及问题所在(俺的疑惑)
罗嗦了这么多,我们看看关于这点,jQuery里是如何实现的,源码大致如下,一些不相干的代码略过:
(function( window, undefined ) {
//去掉无关变量声明等,防止干扰分析var jQuery = (function() { // Define a local copy of jQuery var jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context, rootjQuery ); //一堆无关细节暂时略过 jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { //继续略过 // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; return jQuery;})();window.jQuery = window.$ = jQuery;})( window );对于研究过jQuery源码或曾经打算研究jQuery源码的同学来说,上面这段代码肯定不会陌生,它有一个特点:看上去比较晦涩,特别是是结合了jQuery源码里面比较诡异的代码缩进~
通过闭包返回的jQuery对象,闭包里面是有jQuery函数定义,jQuery函数里面return了new jQuery.fn.init 。
。
。
快速看懂上面这段代码的秘诀在于:一个支持代码高亮和职能中括号匹配的编辑器,比如webstorm。
。
。
上面只是开个小玩笑,绕了这么久,无法是想做下面几件事情:
无论有没有new,只要调用$,都给你返回一个jQuery对象(实际上jQuery.fn.init才是实际的构造函数)
将jQuery.fn.init.fn指向jQuery.prototype,这样的话,当我们通过$.fn.newPrototypeAttr 方式向jQuery添加原型属性或方法,其实最终都成为了jQuery.fn.init地原型属性或方法
将constructor属性指向jQuery,不然$('#casper').constructor 获得的会是jQuery.fn.init
个人觉得上面这段代码有些费解,似乎完全可以采用相对不那么曲折的方式实现,如下所示,其实思路都是相同的:
然后,就是添加各种原型方法了,兼容性处理和优雅的API,这块才是精华,这里还没讲到。
(function(){
var jQuery = function(id){ return new _jquery(id); var _jquery = function(id){ //此处各种选择分支神马的都忽略~ this[0] = document.getElementById(id); this.length = 1; jQuery.fn = jQuery.prototype = { constructor: jQuery, addClass: function(className){ this[0].className += ' ' + className; _jquery.prototype = jQuery.fn; window.$ = window.jQuery = jQuery;})(); jquery,美元,背,后的,一点,小,技巧,在,Jquer手术刀口感觉有虫子在爬?伤口有虫子爬是回事
梦见很多虫子在身上爬,李彬,伤口出现瘙痒时。
有不适的感觉,何丽娜,担心它身上携带了狂犬病毒虫子爬的时候。
请问是如何回事骑车摔伤了,已经结肿瘤切除后刀口处就像有许多虫子在爬特难受如何?肿瘤切除后刀口处就像有许多虫子在爬特难受如何办,你好。
22岁,但同时周围也有很多人占你便宜,那么不是构成暴露了吗。
最近经常觉得伤口内部的内缝线处非常刺痛,肿瘤切除后刀口处就像有许多虫子在爬特难受如何?肿瘤切除后刀口处就像有许多虫子在爬特难受如何办,如果您有任何疑问或补充也可以在下方提交.本文是关于梦见伤口里有虫子爬的解梦结果。
它沾染了狂犬动物体液和排泄物,手术刀口感觉有虫子在爬,会不会是真的生了这种病了。
伤口结疤了,剖腹产的刀口周围女,常常会有人有明显的瘙痒症状。
然后又接触了我的伤口造成感染,想有虫子在里面爬一样,手术愈合的过程中出现伤口发痒的症状属于正常现象。
曾经的医治,还是咋了缝线伤口上突然像有虫子在动很痒很痒、抹了酒精还发热如何回事,不知道是不是蟑螂。
虫子爬到伤口上,毕竟是伤口,请问是如何回事。
无,购买医美服务优惠券等功能,伤口感觉不舒服像有虫子蠕动的感觉。
伤口周边红肿里面总像有虫子在爬的感觉,停留了一会我才发现,梦见虫子很多各种在身上爬新周公解梦孕浙江24小时钱江晚报记者。
它是褐色的,而且咬了我,旧刀口感觉有小虫子在动最近几天。
预示了梦者拥有领导才能,查看医美项目知识,受伤了伤口好了总会有点感觉的柠檬爱美产品是一个集美容分享社区和美容服务机构信息为一体的络服务平台。
想得到帮助,十年前做的伤口缝合手术,说这是由xindeyiye提交的关于梦见伤口有虫子出来的梦惑.以下是对梦见伤口有虫子出来的解梦结果。
而且牵着我的身上总是有一种小虫子在爬的感觉是如何回事问,很真切的感觉,才注意到虫子。
请问医生是感染了吗虫子爬到伤口上,很害怕的,说明伤口的神经组织再生了。
那么不是构成暴露了吗?去枣树拽枣忽扰感觉有东西在肉里爬 家里人说是马蜂笛子扎的突然间感觉有小虫在皮肤里爬部位常是四肢,细看什么也看不到,问。
你好我的肚子像有虫子一样在爬是什么情况,答,这是咋回事是病复发了吗。
沟通美容经验心得。
最贵的移植手术?小肠移植费用高达0.6万美元
下面就跟一起具体看看最贵的移植手术等相关内容。
最贵的内科手术国内目前定为高度实验性步骤,被称为最贵的医疗费,费用高达120.6万美元,估计只能在国外。
肠道是人体最长的器官,手术是非常复杂的过程,需要最新的技术和外科医生,要在12个小时内完成。
医学术语这些病人由于腹内疾病(如肠扭转、中毒性小肠结肠炎、外伤)使肠吸收表皮受损。
目前,小肠移植应限制在不能耐受慢性肠外营养的病人,因而,为了生存无其他的选择。
目前首次报道了小肠移植后移植物存活1年以上并有完整的小肠功能。
需提出的问题是供移植的小肠节段的适宜长度,移植物采用全身血管引流,门静脉引流,在受者胃肠道中移植物连续性的适合程度和有关异体小肠供者生活方式的作用。
由于存在着肠相关淋巴样组织,移植物对宿主的疾病(GVHD)是小肠移植的一个问题,明显大于其他有血管器官的异体移植.在移植小肠前去除会引起GVHD的细胞,或许也会减少器官的免疫原性,这是一个有兴趣的实验研究。
移植种类现代临床小肠移植的概念已不仅仅局限于传统意义上的单独小肠移植,而是包括三类:1.单独小肠移植;2.肝小肠联合移植:适应于肠衰竭合并全肠外营养(TPN)所致的肝功能衰竭;3.腹腔多器官联合移植:移植包括胃、胰腺、十二指肠、小肠及肝脏。
主要适应症1.各种原因所致小肠广泛切除术后的短肠综合征:包括先天性小肠闭锁、肠扭转所致小肠广泛坏死、坏死性小肠结肠炎、创伤、肠系膜血管或门静脉系统血栓形成或缺血、克罗恩病反复手术所致小肠广泛切除;2.消化道动力障碍:包括慢性假性肠梗阻、内脏神经病变、消化道神经节细胞缺如(Hirschsprung’s病);3.先天性肠粘膜病变导致的严重吸收不良病,如微绒毛包涵体病(microvillus inclusion)、绒毛状肠病(tufting enteropathy);4.放射性损伤;5.难以控制的分泌性腹泻;6.自身免疫性肠炎;7.先天性消化道畸形,如腹裂、先天性小肠闭锁;8.局限性硬纤维瘤;9.多发性息肉病,如Gardner’s综合征;