前言
當我們想要創建一個對象,我們可能使用new方法去構建一個對象,那按道理jquery也是一個對象,應該也是用new jquery()來構建呀為什么我們創建jquery對象不用new jquery()而是直接使用類似$(ele)的方式去構建出來一個jquery對象呢?其實內部還是使用了new來構建的,只是jquery內部幫我們構建了而已,請看下面代碼
function Jquery(selector, context) { return new Jquery(selector, context); } 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死循環的問題確實解決了,但是又發現了新的問題,可以看到a和b兩個對象的屬性是公用的,我修改a.name屬性為na,b.name屬性也跟著變為了na,其原因就是this都是指向Jquery的
為了解決這個問題,我們可以每次調用Jquery()的時候都構建一個新的對象,改進代碼如下:
function Jquery(selector, context) { return new Jquery.prototype.init(selector, context); //注意看,這里多了個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); //na這樣處理之后,屬性共享的問題已經解決了,每個對象都有各自的屬性,可以自由修改,每個對象互不影響,但是又又又發現了新的問題,可以看到我們控制臺打印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; }}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); //na
新聞熱點
疑難解答
圖片精選