jquery學(xué)習(xí)筆記之無(wú)new構(gòu)建詳解
前言
當(dāng)我們想要?jiǎng)?chuàng)建一個(gè)對(duì)象,我們可能使用new方法去構(gòu)建一個(gè)對(duì)象,那按道理jquery也是一個(gè)對(duì)象,應(yīng)該也是用new jquery()
來(lái)構(gòu)建呀為什么我們創(chuàng)建jquery對(duì)象不用new jquery()
而是直接使用類(lèi)似$(ele)
的方式去構(gòu)建出來(lái)一個(gè)jquery對(duì)象呢?其實(shí)內(nèi)部還是使用了new來(lái)構(gòu)建的,只是jquery內(nèi)部幫我們構(gòu)建了而已,請(qǐng)看下面代碼
function Jquery(selector, context) { return new Jquery(selector, context); } Jquery.prototype = { version:'1.01' }
直接這樣內(nèi)部使用new來(lái)構(gòu)建Jquery,很明顯是有問(wèn)題的,這樣的話(huà)就形成了死循環(huán)。為了解決死循環(huán)的問(wèn)題,請(qǐng)看下面代碼:
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.01 console.log(a.name); //lin a.name = "na"; console.log(b.name); //na
死循環(huán)的問(wèn)題確實(shí)解決了,但是又發(fā)現(xiàn)了新的問(wèn)題,可以看到a和b兩個(gè)對(duì)象的屬性是公用的,我修改a.name
屬性為na,b.name
屬性也跟著變?yōu)榱薾a,其原因就是this都是指向Jquery的
為了解決這個(gè)問(wèn)題,我們可以每次調(diào)用Jquery()
的時(shí)候都構(gòu)建一個(gè)新的對(duì)象,改進(jìn)代碼如下:
function Jquery(selector, context) { return new Jquery.prototype.init(selector, context); //注意看,這里多了個(gè)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); //undefined console.log(a.name); //lin a.name = "na"; console.log(b.name); //na
這樣處理之后,屬性共享的問(wèn)題已經(jīng)解決了,每個(gè)對(duì)象都有各自的屬性,可以自由修改,每個(gè)對(duì)象互不影響,但是又又又發(fā)現(xiàn)了新的問(wèn)題,可以看到我們控制臺(tái)打印a.version這個(gè)屬性的時(shí)候是讀取不到這個(gè)屬性的,原因就在于此時(shí)Jquery.prototype
和Jquery.prototype.init.prototype
是互不相干的,我們創(chuàng)建的是Jquery.prototype.init
對(duì)象,所以只能讀到Jquery.prototype.init.prototype
上的屬性而讀取不到Jquery.prototype
上的屬性的(該例指version這個(gè)屬性),解決辦法很簡(jiǎn)單,就是把Jquery.prototype
賦值給Jquery.prototype.init.prototype
,這樣就相當(dāng)于把Jquery原型上的屬性全部賦值到了Jquery.init
的原型上,請(qǐng)看下面代碼:
function Jquery(selector, context) { return new Jquery.prototype.init(selector, context); } Jquery.prototype = { version:'1.01', init: function () { this.name = "lin"; return this; } } Jquery.prototype.init.prototype = Jquery.prototype; //畫(huà)龍點(diǎn)睛之筆 var a = Jquery(); var b = Jquery(); console.log(a.version); //1.01 console.log(a.name); //lin a.name = "na"; console.log(b.name); //na
可以看到,我們控制臺(tái)打印a對(duì)象的version屬性,已經(jīng)可以讀取并且打印出來(lái)了。
至此,已經(jīng)完成了Jquery的無(wú)new構(gòu)建。
ps:jQuery.fn其實(shí)就是jQuery的prototype,jquery源碼可以看到該條語(yǔ)句:jQuery.fn = jQuery.prototype = {};
$()和jquery()其實(shí)是一樣的,jquery源碼可以看到該條語(yǔ)句: window.jQuery = window.$ = jQuery;
原型 prototype
認(rèn)識(shí)一下什么是原型?
在JavaScript中,原型也是一個(gè)對(duì)象,通過(guò)原型可以實(shí)現(xiàn)對(duì)象的屬性繼承,JavaScript的對(duì)象中都包含了一個(gè)" [[Prototype]]"內(nèi)部屬性,這個(gè)屬性所對(duì)應(yīng)的就是該對(duì)象的原型。
對(duì)于"prototype"和"__proto__"這兩個(gè)屬性有的時(shí)候可能會(huì)弄混,"Person.prototype"和"Person.__proto__"是完全不同的。
在這里對(duì)"prototype"和"__proto__"進(jìn)行簡(jiǎn)單的介紹:
對(duì)于所有的對(duì)象,都有__proto__屬性,這個(gè)屬性對(duì)應(yīng)該對(duì)象的原型
對(duì)于函數(shù)對(duì)象,除了__proto__屬性之外,還有prototype屬性,當(dāng)一個(gè)函數(shù)被用作構(gòu)造函數(shù)來(lái)創(chuàng)建實(shí)例時(shí),該函數(shù)的prototype屬性值將被作為原型賦值給所有對(duì)象實(shí)例(也就是設(shè)置實(shí)例的__proto__屬性)
function Person(name, age){ this.name = name; this.age = age; } Person.prototype.getInfo = function(){ console.log(this.name + " is " + this.age + " years old"); }; //調(diào)用 var will = new Person("Will", 28); will.getInfo();//"Will is 28 years old"
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
jquery實(shí)現(xiàn)垂直手風(fēng)琴菜單
這篇文章主要為大家詳細(xì)介紹了jquery實(shí)現(xiàn)垂直手風(fēng)琴菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-0340個(gè)有創(chuàng)意的jQuery圖片和內(nèi)容滑動(dòng)及彈出插件收藏集之二
在網(wǎng)頁(yè)的首頁(yè)或圖片專(zhuān)題頁(yè)面很多地方都會(huì)用到圖片滑動(dòng)插件來(lái)循環(huán)切換多張圖片,并且用戶(hù)可以點(diǎn)擊左右按鈕來(lái)切換圖片。2011-12-12JQuery中$.ajax()方法參數(shù)詳解及應(yīng)用
JQuery中$.ajax()方法想必大家并不陌生吧,在本文將為大家介紹下其參數(shù)及應(yīng)用示例,感興趣的朋友不要錯(cuò)過(guò)2013-12-12快速解決jquery之get緩存問(wèn)題的最簡(jiǎn)單方法介紹
要解決該問(wèn)題有很多辦法,最直接的是把$.get()方法換成$.ajax(),然后配置cache:false即可。我不喜歡$.ajax()繁瑣的配置方式,可采取以下最簡(jiǎn)單方式實(shí)現(xiàn)2013-12-12jquery實(shí)現(xiàn)浮動(dòng)在網(wǎng)頁(yè)右下角的彩票開(kāi)獎(jiǎng)公告窗口代碼
這篇文章主要介紹了jquery實(shí)現(xiàn)浮動(dòng)在網(wǎng)頁(yè)右下角的彩票開(kāi)獎(jiǎng)公告窗口代碼,涉及jquery窗體的彈出及隱藏相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09JQuery自定義事件的應(yīng)用 JQuery最佳實(shí)踐
本文主要介紹JQuery框架里面支持的自定義事件模型,通過(guò)實(shí)例說(shuō)明什么時(shí)候可以利用事件模型進(jìn)行面向?qū)ο蟮腏S編程,以及利用“帶命名空間的事件處理函數(shù)”來(lái)避免unbind時(shí)影響別的事件訂閱。2010-08-08鼠標(biāo)拖動(dòng)實(shí)現(xiàn)DIV排序示例代碼
鼠標(biāo)拖動(dòng)實(shí)現(xiàn)DIV排序的教程有很多,在本文將為大家詳細(xì)介紹個(gè)不錯(cuò)的示例,對(duì)比傳統(tǒng)的排序,這是一個(gè)很不錯(cuò)的嘗試2013-10-10