大部分人使用 jQuery 的時候都是使用第一種無 new 的構造方式,直接 $('') 進行構造,這也是 jQuery 十分便捷的一個地方。這篇文章主要給大家介紹了關於jquery學習筆記之無new構建的相關資料,需要的朋友們下面來一起看看吧。
前言
當我們想要建立一個對象,我們可能使用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.01 console.log(a.name); //lin a.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); //undefined console.log(a.name); //lin a.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.01 console.log(a.name); //lin a.name = "na"; console.log(b.name); //na
可以看到,我們控制台列印a物件的version屬性,已經可以讀取並且列印出來了。
至此,已經完成了Jquery的無new建置。
ps:jQuery.fn其實就是jQuery的prototype,jquery原始碼可以看到該條語句:jQuery.fn = jQuery.prototype = { };
$()和jquery()其實是一樣的,jquery原始碼可以看到該條語句: window.jQuery = window.$ = jQuery;
原型prototype
認識什麼是原型?
在JavaScript中,原型也是一個對象,透過原型可以實現物件的屬性繼承,JavaScript的物件中都包含了一個" [[Prototype]]"內部屬性,這個屬性所對應的就是該物件的原型。
對於"prototype"和"__proto__"這兩個屬性有的時候可能會弄混,"Person.prototype"和"Person.__proto__"是完全不同的。
在這裡對"prototype"和"__proto__"進行簡單的介紹:
對於所有的對象,都有__proto__屬性,這個屬性對應該對象的原型
對於函數對象,除了__proto__屬性之外,還有prototype屬性,當一個函數被用作構造函數來創建實例時,該函數的prototype屬性值將被作為原型賦值給所有物件實例(也就是設定實例的__proto__屬性)
function Person(name, age){ this.name = name; this.age = age; } Person.prototype.getInfo = function(){ console.log(this.name + " is " + this.age + " years old"); }; //调用 var will = new Person("Will", 28); will.getInfo();//"Will is 28 years old"
上面是我整理給大家的,希望今後會對大家有幫助。
相關文章:
以上是在jquery中有關無new如何構建的詳細內容。更多資訊請關注PHP中文網其他相關文章!