日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

如何使用Javascript中的this關(guān)鍵字

瀏覽:25日期:2023-06-20 16:00:04

一、基本的:

function doSomething(){alert(this.id);}alert(window.doSomething);//證明了doSomething是屬于window的doSomething();//undefinedwindow.onload = function(){document.getElementById('div2').onclick = doSomething;//div2document.getElementById('div3').onclick = function(){doSomething();}//undefined}

1、對于doSomething這個函數(shù):

function doSomething(){alert(this.id);}

這個函數(shù)是全局函數(shù),這種全局函數(shù)實際上是屬于window的(可以通過window.doSomething來訪問),如果直接調(diào)用,那么根據(jù)“this always refers to the “owner” of the function we’re executing”,那么函數(shù)中的this就是window,但是window沒有id屬性,所以顯示“undefined”;

2、在html元素中這樣調(diào)用

<div onclick='doSomething();'>div1</div>

這時也會顯示“undefined”,這就相當(dāng)于如下代碼:

document.getElementById('div1').onclick = function(){doSomething();}

當(dāng)點擊div1時,調(diào)用屬于window的doSomething函數(shù),所以也是顯示“undefined”;

3、通過js來綁定事件,在div2載入過后:

document.getElementById('div2').onclick = doSomething;

當(dāng)點擊div2時,顯示“div2”,因為在給div2的onclick賦值,是將doSomething拷貝了一次,這時拷貝的這個函數(shù)是屬于div2的了,跟屬于window的doSomething沒有任何關(guān)系了。點擊div2時,就會觸發(fā)屬于div2的doSomething,這里的this就是指div2。

二、attachEvent和addEventListener 

attachEvent是在ie中綁定事件的方法,會將相應(yīng)函數(shù)拷貝到全局(即響應(yīng)函數(shù)的owner為window),但是在DOM標準中,addEventListener綁定的事件時拷貝的響應(yīng)函數(shù)的owner為事件所綁定的對象

function doSomething(){alert(this.id);alert(this == window);}window.onload = function(){var div1 = document.getElementById('div1');if(div1.attachEvent){div1.attachEvent('onclick',doSomething);document.body.appendChild(document.createTextNode('attachEvent'));}else if(div1.addEventListener){div1.addEventListener('click',doSomething,false);document.body.appendChild(document.createTextNode('addEventListener'));}else{div.onclick = doSomething;}}

對于函數(shù)doSomething

function doSomething(){alert(this.id);alert(this == window);}

1、使用attachEvent綁定到div1的click事件上,doSometing會被復(fù)制到window,這時doSomething里面的this指的是window,點擊div1時會顯示“undefined”和“true”

2、使用addEventListener綁定div1的click事件,這時將doSomething拷貝,這個拷貝過后的函數(shù)是屬于div1的,所以點擊div1時會顯示“div1”和“false”,看如下代碼

var obj = new Object();obj.color = 'black';obj.showColor = function(){alert(this.color);alert(this == window);}obj.showColor();var div1 = document.getElementById('div1');div1.attachEvent('onclick',obj.showColor);

此時點擊div1的時候,會顯示“undefined”和“true”,如果attachEvent僅僅是引用obj.showColor的話,那么this還是應(yīng)該指的是obj,但是實際上這里this指的是window,所以我認為這里不是引用,而是拷貝到全局的。

三、關(guān)于對象冒充的繼承方式 

1、new與不new的區(qū)別

對于如下function

function ClassA(sColor){this.color = sColor;this.sayColor = function(){alert(this.color);}}

這是一個類還是一個函數(shù)?隨你而定!

如果你認為這是一個函數(shù),那么我們可以這樣來調(diào)用它:

ClassA('red');

“red”是傳遞的一個參數(shù),ClassA中的this指的是當(dāng)然就是指的window了,所以現(xiàn)在window有了color屬性和sayColor方法,并且color有“red”這個值。

這是調(diào)用sayColor或者window.sayColor都可以顯示“red”;

window.sayColor();

如果你認為這是一個類,那么我們應(yīng)該這樣使用它:

var obj = new ClassA('red');

new這個關(guān)鍵詞的出現(xiàn)讓上面這一句代碼增加了不少內(nèi)容:首先,創(chuàng)建一個Object實例,然后,將ClassA中的this指向創(chuàng)建的這個Object中,最后返回這個Object,所以返回的這個Object就賦值給了obj。所以我們可以說this指向的是obj,obj擁有了color屬性和sayColor方法,并且color屬性值為“red”。

2、函數(shù)的owener

function showId(){alert(this.id);}window.onload = function(){var div1 = document.getElementById('div1');div1.onclick = showId;div1.show = showId;div1.show();var obj = new Object();obj.id = 'obj';obj.show = showId;obj.show();}

我們可以將showId這個函數(shù)賦值給click事件,也可以賦值給任何一個對象的任何一個屬性,這是也會拷貝showId這個方法的,所以我們在調(diào)用div1.show方法時,this是指向div1的,在調(diào)用obj.show時,this指向的是obj的。

3、對象冒充的原理

下面的代碼是通過對象冒充方法實現(xiàn)的繼承

function ClassA(sColor){this.color = sColor;this.sayColor = function(){alert(this.color);}}function ClassB(sColor,sName){this.newMethod = ClassA;this.newMethod(sColor);delete this.newMethod;this.name = sName;this.sayName = function(){alert(this.name);}}var objB = new ClassB('color of objB','name of objB');objB.sayColor();

objB是ClassB的一個實例,objB是如何擁有color屬性和sayColor方法的呢?

首先從實例化的代碼看起:

var objB = new ClassB('color of objB','name of objB');

這里ClassB是個類,ClassB中的this當(dāng)然就是指的objB這個對象;

在ClassB中,前三行代碼會用到ClassA,這時就把ClassA看作一個函數(shù),而不是類。

我們?nèi)绻苯诱{(diào)用ClassA這個函數(shù),那么很顯然,ClassA中的this指的就是window對象了,所以我們先將ClassA拷貝到objB的newMethod這個屬性中(this.newMethod = ClassA),

然后再調(diào)用this.newMethod,這是這個方法的owener明顯的已經(jīng)成了this,而ClassB中的this在當(dāng)前指的是objB,所以此時ClassA中(嚴格的說是newMethod中,因為這是拷貝過后的,跟ClassA已經(jīng)是兩個方法了)的this就是指的objB,這樣在通過newMethod的調(diào)用,就給objB賦值了color屬性和sayColor方法。用call和apply方法來實現(xiàn)繼承實際上也是一個原理,call和apply可以看作是改變方法的owner的方法,而這里ClassB中的前三句代碼也就是起這個作用的。

四、prototype1.6中的Class.create

prototype1.6中的Class.create方法大致如下:

var Class = {create: function() {//function klass() {this.initialize.apply(this, arguments);}//for (var i = 0; i < properties.length; i++)klass.addMethods(properties[i]);//return klass;}};

在使用的時候是這樣的:

var Person = Class.create({initialize:function(name){this.name = name;},say:function(message){alert(this.name + ':' + message);}});var aPerson = new Person('name1');aPerson.say('hello1');

Person實際上是通過Class.create這個方法所返回的klass(klass是Class.create中的局部變量,是一個function),Class.create所傳遞的參數(shù)(initialize方法和say方法)傳遞到create方法中的properties數(shù)組中并且通過addMethods方法讓klass的prototype擁有這些方法。那么最關(guān)鍵的地方也是最難以理解的地方是:klass中的this究竟是指的是什么。仔細想一想就不難得到答案,Person實際上就是klass,而我們在實例化Person對象的時候,是用了new關(guān)鍵詞的:

var aPerson = new Person('name1');

這就等價于

var aPerson = new klass('name1');

雖然klass在外面不能被訪問到,但是這樣能很輕易的說明問題,klass是一個類而不是簡單的一個函數(shù)(我們看作如此,因為用了new關(guān)鍵字),那么klass中的this就指的是聲明的實例,在這里就是aPerson,aPerson通過klass的prototype能夠擁有initialize方法和say方法,在new的過程中,也會執(zhí)行klass中的代碼,所以initialize在實例化的時候會執(zhí)行,即構(gòu)造函數(shù)。(在klass里兩個this都是指的aPerson,為什么還要通過apply調(diào)用一次呢?這主要是為了傳遞構(gòu)造函數(shù)的參數(shù),用apply方法可以將數(shù)目不定的多個參數(shù)通過數(shù)組方便的傳到initialize方法中去。)

五、再分析幾個例子

從別的文章里看到的例子,我在這里分析一下:

1、運行如下代碼

function OuterFoo(){this.Name = ’Outer Name’;function InnerFoo(){var Name = ’Inner Name’;alert(Name + ’, ’ + this.Name);}return InnerFoo;}OuterFoo()();

所顯示的結(jié)果是“Inner Name, Outer Name”

OuterFoo是一個函數(shù)(而不是類),那么第一句

this.Name = ’Outer Name’;

中的this指的是window對象,所以O(shè)uterFoo()過后window.Name = ‘Outer Name’;

并且將InnerFoo返回,此時InnerFoo同樣是一個函數(shù)(不是類),執(zhí)行InnerFoo的時候,this同樣指window,所以InnerFoo中的this.Name的值為”O(jiān)uter Name”(window.Name充當(dāng)了一個中轉(zhuǎn)站的角色,讓OuterFoo能夠向InnerFoo傳遞“Outer Name”這個值),而Name的值即為局部變量”Inner Name”

2、運行如下代碼

function JSClass(){this.m_Text = ’division element’;this.m_Element = document.createElement(’DIV’);this.m_Element.innerHTML = this.m_Text;if(this.m_Element.attachEvent)this.m_Element.attachEvent(’onclick’, this.ToString);else if(this.m_Element.addEventListener)this.m_Element.addEventListener(’click’, this.ToString,false);elsethis.m_Element.onclick = this.ToString;}JSClass.prototype.Render = function(){document.body.appendChild(this.m_Element);}JSClass.prototype.ToString = function(){alert(this.m_Text);alert(this == window);}window.onload = function(){var jc = new JSClass();jc.Render();jc.ToString();}

點擊“division element”會顯示“undefined”,在ie下還要顯示“true”,其他瀏覽器中還要顯示“false”。

實例聲明和調(diào)用實例方法都沒什么可說的,元素的click事件的綁定到了一個實例的方法,那么通過addEventListener綁定到的方法是拷貝過后的,所以this指的是html元素,這個元素沒有m_Text屬性(m_Text屬性是屬于JSClass的實例的,即屬于jc的),所以點擊元素顯示undefined,attachEvent綁定的事件會將函數(shù)復(fù)制到全局,此時this指的是window對象,點擊元素也會顯示“undefined”。只有在調(diào)用jc.ToString()方法是,this指的是jc這個對象,因為jc擁有m_Text,所以能夠顯示“division element”。

六、總結(jié)

怎樣在一個代碼環(huán)境中快速的找到this所指的對象呢?我想要注意以下三個方面:

1、 要清楚的知道對于函數(shù)的每一步操作是拷貝還是引用(調(diào)用)

2、 要清楚的知道函數(shù)的擁有者(owner)是什么

3、 對于一個function,我們要搞清楚我們是把它當(dāng)作函數(shù)使用還是在當(dāng)作類使用

補充:

1.在實例和類上都可以直接定義函數(shù)

2.不能在實例上使用prototype定義函數(shù),只能在類上使用prototype定義函數(shù)

3.類上直接定義的函數(shù)不能使用this訪問對象的屬性

4.在類的prototype上建立的函數(shù)可以用this,在類內(nèi)部定義的函數(shù)可以使用this,在對象實例上建立的函數(shù)額可以this

window.alert=function (msg){document.write(msg+'<br>');}function say(){this.f='props';this.func3=function(){alert('f3,'+this.f);}}say.func1=function(){alert('func1,'+this.f);}; //Error,類上直接定義的函數(shù),不能使用thissay.prototype.func2=function(){alert('func2,'+this.f);}say.func1();(new say()).func2();say.func2(); //Error, 在用prototype定義的函數(shù),必須實例化對象才能調(diào)用say.func3(); //Error,在類上定義的函數(shù),必須實例化才能調(diào)用(new say()).func3();var obj={fld1:10,func1:function(msg){alert(msg);},func4:function(){alert(this.fld1);}}obj.prototype.func=function(){alert('func');}; //Error 實例對象上不能使用prototype定義對象obj.func2=function(){alert('func2,'+this.fld1);}; //ok,實例上直接定義的函數(shù)可以使用this,訪問對象的屬性alert(obj.fld1);obj.func1('func1');obj.func2();obj.func4();

以上就是如何使用Javascript中的this關(guān)鍵字的詳細內(nèi)容,更多關(guān)于js this關(guān)鍵字的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区二区精品福利地址| 亚洲深夜影院| 蜜臀精品一区二区三区在线观看| 桃色av一区二区| 精品精品久久| 精品福利久久久| 久久不见久久见国语| 青草国产精品| 欧美日韩一区二区三区不卡视频| 蜜桃一区二区三区在线观看| 久久国产成人| av不卡在线看| 丝袜脚交一区二区| 视频一区二区三区中文字幕| 蜜臀久久久久久久| 亚洲精品福利| 欧美影院视频| 欧美精品二区| 久久男人天堂| 欧美日韩精品一区二区视频| 婷婷综合五月| 喷白浆一区二区| 亚洲一区二区三区中文字幕在线观看| 亚欧成人精品| 国产精品久久久久久av公交车| 久久精品国产999大香线蕉| 亚洲黄色网址| 在线精品视频在线观看高清| 亚洲日本国产| 欧美黄页在线免费观看 | 国产欧美一区二区三区国产幕精品| 国产丝袜一区| 福利视频一区| 欧美在线网站| 亚洲久久一区| 美女在线视频一区| 91精品一区二区三区综合在线爱| 免费日本视频一区| 久久精品一区二区三区中文字幕| 久久久精品午夜少妇| 六月婷婷一区| 九九99久久精品在免费线bt| 国产尤物精品| 欧美一级二区| 日韩大片在线| 亚洲资源网站| 福利片在线一区二区| 激情欧美国产欧美| 日本不卡视频在线观看 | 国产 日韩 欧美一区| 九色精品91| 清纯唯美亚洲综合一区| 精品国产免费人成网站| 蜜臀av亚洲一区中文字幕| 卡一卡二国产精品| 视频在线观看一区| 成人午夜毛片| 亚洲香蕉久久| 亚洲1234区| 日韩av在线播放中文字幕| 精精国产xxxx视频在线野外| 日韩中文字幕视频网| 国产一区二区三区久久 | 久久久久久久久99精品大| 亚洲一区av| 激情国产在线| 欧美日韩午夜| 国户精品久久久久久久久久久不卡| 日本vs亚洲vs韩国一区三区二区| 青青青免费在线视频| 日韩av一区二区三区四区| 久久一级电影| 狂野欧美性猛交xxxx| 一区在线免费| 黄色网一区二区| 亚洲精品麻豆| 2023国产精品久久久精品双| 久久精品国产99国产精品| 亚洲综合色婷婷在线观看| 香蕉久久99| 精品一区二区三区亚洲| 亚洲tv在线| 欧美午夜不卡| 亚洲伦乱视频| 精品视频一区二区三区在线观看| 亚洲视频二区| 欧美日韩中文字幕一区二区三区 | 精品网站999| 亚洲精品四区| 一区免费在线| 99久久九九| 91亚洲成人| 久久精品国产精品亚洲毛片| 综合视频一区| 亚洲欧美日韩视频二区| 国产亚洲一区二区手机在线观看| 国产精品极品| 日本久久一区| 一区二区三区网站| 亚洲激情中文| 午夜精品久久久久久久久久蜜桃| 国产精品日本一区二区三区在线 | 欧美69视频| 成人一区而且| 国产精品传媒麻豆hd| 日韩中文字幕在线一区| 亚洲一区二区三区免费在线观看| 久久久久美女| 91亚洲一区| 捆绑调教日本一区二区三区| 久久av导航| 久久福利在线| 免费在线欧美黄色| 久久av日韩| 欧美极品一区二区三区| 国产精品hd| 国产精品麻豆成人av电影艾秋| 日本vs亚洲vs韩国一区三区二区| 喷白浆一区二区| 在线精品一区二区| 亚洲一二av| 日韩一区二区三区四区五区| 亚洲男人在线| 亚洲综合色婷婷在线观看| 综合国产精品| 综合一区av| 蜜臀av一区二区在线免费观看| 视频在线在亚洲| 亚洲理论在线| 少妇精品久久久一区二区三区| 亚洲日韩视频| 欧美久久久网站| 国产精品白丝一区二区三区| 国产精品久久久久久av公交车| 麻豆精品99| 国产理论在线| 久久麻豆精品| 亚洲一区二区av| 欧美一级网址| 精品视频免费| 色婷婷色综合| 久久国产日本精品| 蜜臀av免费一区二区三区| 模特精品在线| 日韩精品免费观看视频| 亚洲精品乱码| 国产亚洲字幕| 精品久久精品| 久久久五月天| 水野朝阳av一区二区三区| 欧美亚洲人成在线| 久久久久黄色| 亚洲黑丝一区二区| 一区二区三区四区日韩| 国产色噜噜噜91在线精品| 久久超级碰碰| 成人看片网站| 免费人成黄页网站在线一区二区 | 亚洲专区视频| 麻豆精品国产91久久久久久| 色老板在线视频一区二区| 亚洲综合二区| 欧美日韩精品一区二区三区视频 | 99久精品视频在线观看视频| 美女久久网站| 欧美日韩一区二区三区不卡视频 | 麻豆久久一区| 久久精品欧美一区| 亚洲精品成人一区| 麻豆91精品视频| 久久在线电影| 奇米色欧美一区二区三区| 国产videos久久| 亚洲欧美伊人| 日韩高清国产一区在线| 精品一区二区三区四区五区| 亚洲网站视频| 日韩高清不卡在线| 日韩欧美字幕| 日韩中文字幕| 欧美久久天堂| 蜜桃久久久久久| 久久久久久婷| 蜜臀久久99精品久久久久久9 | 日本免费久久| 日韩精品导航| 久久久精品午夜少妇| 日本成人在线网站| 日韩精品第一区| 欧美色综合网| 婷婷综合五月| 久久精品系列| 综合色一区二区| 性欧美videohd高精| 亚洲免费专区| av综合电影网站| 日韩欧美中文字幕在线视频| 蜜臀国产一区| 国产精品网在线观看| 亚洲一区成人|