jquery學習筆記之無new構(gòu)建詳解
前言
當我們想要創(chuàng)建一個對象,我們可能使用new方法去構(gòu)建一個對象,那按道理jquery也是一個對象,應該也是用new jquery()來構(gòu)建呀為什么我們創(chuàng)建jquery對象不用new jquery()而是直接使用類似$(ele)的方式去構(gòu)建出來一個jquery對象呢?其實內(nèi)部還是使用了new來構(gòu)建的,只是jquery內(nèi)部幫我們構(gòu)建了而已,請看下面代碼
function Jquery(selector, context) {
return new Jquery(selector, context);
}
Jquery.prototype = {
version:'1.01'
}
直接這樣內(nèi)部使用new來構(gòu)建Jquery,很明顯是有問題的,這樣的話就形成了死循環(huán)。為了解決死循環(huán)的問題,請看下面代碼:
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)的問題確實解決了,但是又發(fā)現(xiàn)了新的問題,可以看到a和b兩個對象的屬性是公用的,我修改a.name屬性為na,b.name屬性也跟著變?yōu)榱薾a,其原因就是this都是指向Jquery的
為了解決這個問題,我們可以每次調(diào)用Jquery()的時候都構(gòu)建一個新的對象,改進代碼如下:
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
這樣處理之后,屬性共享的問題已經(jīng)解決了,每個對象都有各自的屬性,可以自由修改,每個對象互不影響,但是又又又發(fā)現(xiàn)了新的問題,可以看到我們控制臺打印a.version這個屬性的時候是讀取不到這個屬性的,原因就在于此時Jquery.prototype和Jquery.prototype.init.prototype是互不相干的,我們創(chuàng)建的是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屬性,已經(jīng)可以讀取并且打印出來了。
至此,已經(jīng)完成了Jquery的無new構(gòu)建。
ps:jQuery.fn其實就是jQuery的prototype,jquery源碼可以看到該條語句:jQuery.fn = jQuery.prototype = {};
$()和jquery()其實是一樣的,jquery源碼可以看到該條語句: window.jQuery = window.$ = jQuery;
原型 prototype
認識一下什么是原型?
在JavaScript中,原型也是一個對象,通過原型可以實現(xiàn)對象的屬性繼承,JavaScript的對象中都包含了一個" [[Prototype]]"內(nèi)部屬性,這個屬性所對應的就是該對象的原型。
對于"prototype"和"__proto__"這兩個屬性有的時候可能會弄混,"Person.prototype"和"Person.__proto__"是完全不同的。
在這里對"prototype"和"__proto__"進行簡單的介紹:
對于所有的對象,都有__proto__屬性,這個屬性對應該對象的原型
對于函數(shù)對象,除了__proto__屬性之外,還有prototype屬性,當一個函數(shù)被用作構(gòu)造函數(shù)來創(chuàng)建實例時,該函數(shù)的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");
};
//調(diào)用
var will = new Person("Will", 28);
will.getInfo();//"Will is 28 years old"
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
jquery顯示loading圖片直到網(wǎng)頁加載完成的方法
這篇文章主要介紹了jquery顯示loading圖片直到網(wǎng)頁加載完成的方法,涉及jquery頁面加載與動畫效果的使用技巧,需要的朋友可以參考下2015-06-06
jQuery Validate 驗證,校驗規(guī)則寫在控件中的具體實例
本篇文章主要是對jQuery Validate 驗證,校驗規(guī)則寫在控件中的具體實例進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-02-02

