国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

jquery學(xué)習(xí)筆記之無new構(gòu)建詳解

2019-11-19 14:46:32
字體:
供稿:網(wǎng)友

前言

當(dāng)我們想要?jiǎng)?chuàng)建一個(gè)對象,我們可能使用new方法去構(gòu)建一個(gè)對象,那按道理jquery也是一個(gè)對象,應(yīng)該也是用new jquery()來構(gòu)建呀為什么我們創(chuàng)建jquery對象不用new jquery()而是直接使用類似$(ele)的方式去構(gòu)建出來一個(gè)jquery對象呢?其實(shí)內(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.01console.log(a.name); //lina.name = "na";console.log(b.name); //na

死循環(huán)的問題確實(shí)解決了,但是又發(fā)現(xiàn)了新的問題,可以看到a和b兩個(gè)對象的屬性是公用的,我修改a.name屬性為na,b.name屬性也跟著變?yōu)榱薾a,其原因就是this都是指向Jquery的

為了解決這個(gè)問題,我們可以每次調(diào)用Jquery()的時(shí)候都構(gòu)建一個(gè)新的對象,改進(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); //undefinedconsole.log(a.name); //lina.name = "na";console.log(b.name); //na

這樣處理之后,屬性共享的問題已經(jīng)解決了,每個(gè)對象都有各自的屬性,可以自由修改,每個(gè)對象互不影響,但是又又又發(fā)現(xiàn)了新的問題,可以看到我們控制臺打印a.version這個(gè)屬性的時(shí)候是讀取不到這個(gè)屬性的,原因就在于此時(shí)Jquery.prototypeJquery.prototype.init.prototype是互不相干的,我們創(chuàng)建的是Jquery.prototype.init對象,所以只能讀到Jquery.prototype.init.prototype上的屬性而讀取不到Jquery.prototype上的屬性的(該例指version這個(gè)屬性),解決辦法很簡單,就是把Jquery.prototype賦值給Jquery.prototype.init.prototype,這樣就相當(dāng)于把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; //畫龍點(diǎn)睛之筆var a = Jquery();var b = Jquery();console.log(a.version); //1.01console.log(a.name); //lina.name = "na";console.log(b.name); //na

可以看到,我們控制臺打印a對象的version屬性,已經(jīng)可以讀取并且打印出來了。

至此,已經(jīng)完成了Jquery的無new構(gòu)建。

ps:jQuery.fn其實(shí)就是jQuery的prototype,jquery源碼可以看到該條語句:jQuery.fn = jQuery.prototype = {};

  $()和jquery()其實(shí)是一樣的,jquery源碼可以看到該條語句: window.jQuery = window.$ = jQuery;

原型 prototype

認(rèn)識一下什么是原型?

在JavaScript中,原型也是一個(gè)對象,通過原型可以實(shí)現(xiàn)對象的屬性繼承,JavaScript的對象中都包含了一個(gè)" [[Prototype]]"內(nèi)部屬性,這個(gè)屬性所對應(yīng)的就是該對象的原型。

對于"prototype"和"__proto__"這兩個(gè)屬性有的時(shí)候可能會弄混,"Person.prototype"和"Person.__proto__"是完全不同的。

在這里對"prototype"和"__proto__"進(jìn)行簡單的介紹:

對于所有的對象,都有__proto__屬性,這個(gè)屬性對應(yīng)該對象的原型

對于函數(shù)對象,除了__proto__屬性之外,還有prototype屬性,當(dāng)一個(gè)函數(shù)被用作構(gòu)造函數(shù)來創(chuàng)建實(shí)例時(shí),該函數(shù)的prototype屬性值將被作為原型賦值給所有對象實(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é)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對武林網(wǎng)的支持。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 开封县| 扎鲁特旗| 瓦房店市| 济源市| 芜湖市| 定陶县| 大英县| 左贡县| 金昌市| 亚东县| 八宿县| 夏津县| 阿城市| 台州市| 阜康市| 石渠县| 平潭县| 叶城县| 铜鼓县| 昌江| 瑞金市| 海林市| 黑水县| 土默特右旗| 固安县| 淮安市| 宁阳县| 水城县| 南部县| 镇坪县| 阜新市| 鹿邑县| 即墨市| 深泽县| 宽城| 县级市| 天气| 成武县| 白玉县| 五大连池市| 崇信县|