摘要:作為構(gòu)造函數(shù)調(diào)用中沒有類,但是可以從構(gòu)造器中創(chuàng)建對象,并提供了運算符來進(jìn)行調(diào)用該構(gòu)造器。構(gòu)造器的外表跟普通函數(shù)一樣,大部分的函數(shù)都可以當(dāng)做構(gòu)造器使用。如果構(gòu)造函數(shù)顯式的返回一個對象,那么則會指向該對象。
this 的指向
this 是 js 中定義的關(guān)鍵字,它自動定義于每一個函數(shù)域內(nèi),但是它的指向卻讓人很迷惑。在實際應(yīng)用中,this 的指向大致可以分為以下四種情況。
1.作為普通函數(shù)調(diào)用當(dāng)函數(shù)作為一個普通函數(shù)被調(diào)用,this 指向全局對象。在瀏覽器里,全局對象就是 window。
window.name = "linxin"; function getName(){ console.log(this.name); } getName(); // linxin
可以看出,此時 this 指向了全局對象 window。
在ECMAScript5的嚴(yán)格模式下,這種情況 this 已經(jīng)被規(guī)定不會指向全局對象了,而是 undefined。
"use strict"; function fun(){ console.log(this); } fun(); // undefined2.作為對象的方法調(diào)用
當(dāng)函數(shù)作為一個對象里的方法被調(diào)用,this 指向該對象
var obj = { name : "linxin", getName : function(){ console.log(this.name); } } obj.getName(); // linxin
如果把對象的方法賦值給一個變量,再調(diào)用這個變量:
var obj = { fun1 : function(){ console.log(this); } } var fun2 = obj.fun1; fun2(); // window
此時調(diào)用 fun2 方法 輸出了 window 對象,說明此時 this 指向了全局對象。給 fun2 賦值,其實是相當(dāng)于:
var fun2 = function(){ console.log(this); }
可以看出,此時的 this 已經(jīng)跟 obj 沒有任何關(guān)系了。這時 fun2 是作為普通函數(shù)調(diào)用。
3.作為構(gòu)造函數(shù)調(diào)用js中沒有類,但是可以從構(gòu)造器中創(chuàng)建對象,并提供了 new 運算符來進(jìn)行調(diào)用該構(gòu)造器。構(gòu)造器的外表跟普通函數(shù)一樣,大部分的函數(shù)都可以當(dāng)做構(gòu)造器使用。當(dāng)構(gòu)造函數(shù)被調(diào)用時,this 指向了該構(gòu)造函數(shù)實例化出來的對象。
var Person = function(){ this.name = "linxin"; } var obj = new Person(); console.log(obj.name); // linxin
如果構(gòu)造函數(shù)顯式的返回一個對象,那么 this 則會指向該對象。
var Person = function(){ this.name = "linxin"; return { name : "linshuai" } } var obj = new Person(); console.log(obj.name); // linshuai
如果該函數(shù)不用 new 調(diào)用,當(dāng)作普通函數(shù)執(zhí)行,那么 this 依然指向全局對象。
4.call() 或 apply() 調(diào)用通過調(diào)用函數(shù)的 call() 或 apply() 方法可動態(tài)的改變 this 的指向。
var obj1 = { name : "linxin", getName : function(){ console.log(this.name); } } var obj2 = { name : "linshuai" } obj1.getName(); // linxin obj1.getName.call(obj2); // linshuai obj1.getName.apply(obj2); // linshuai
這兩個方法在js中都是非常常用的方法,可以閱讀下一篇:javascript 中 apply 、call 的詳解。
更多文章:lin-xin/blog文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/88193.html
摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點提及,但是只要善于運用,其實基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對方法,包括,,。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。 怎樣使用 this 因為本人屬于偽前端,因此文中只看懂了 8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...
摘要:再來看一個小的示例淘寶騰訊淘寶為什么輸出的依然是淘寶呢調(diào)用的是對象中的方法,方法里面有一個定時器,而定時器的一個參數(shù)是這里的指的就是的對象,然后方法里面有調(diào)用了,但是定時器中的指的是對象,所以最終調(diào)用的是對象中。 1.看前熱身 看一段代碼 var name = javascript; var obj = { name:js, foo:f...
摘要:當(dāng)然這還沒完,因為我們還有重要的一步?jīng)]完成,沒錯就是上面的第行代碼,如果沒有這行代碼實例中的指針是指向構(gòu)造函數(shù)的,這樣顯然是不對的,因為正常情況下應(yīng)該指向它的構(gòu)造函數(shù),因此我們需要手動更改使重新指向?qū)ο蟆? 第一節(jié)內(nèi)容:javaScript原型及原型鏈詳解(二) 第一節(jié)中我們介紹了javascript中的原型和原型鏈,這一節(jié)我們來講利用原型和原型鏈我們可以做些什么。 普通對象的繼承 ...
摘要:參數(shù)和是放在數(shù)組中傳入函數(shù),分別對應(yīng)參數(shù)的列表元素。而原函數(shù)中的并沒有被改變,依舊指向全局對象。保存原函數(shù)保存需要綁定的上下文剩余的參數(shù)轉(zhuǎn)為數(shù)組返回一個新函數(shù)下一篇介紹閉包中閉包的詳解。 apply 和 call 的區(qū)別 ECMAScript 規(guī)范給所有函數(shù)都定義了 call 與 apply 兩個方法,它們的應(yīng)用非常廣泛,它們的作用也是一模一樣,只是傳參的形式有區(qū)別而已。 apply(...
今天我們講講JavaScript隊列數(shù)據(jù)結(jié)構(gòu)詳解。 什么是隊列? 隊列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),隊列有兩種操作:插入和刪除;入隊和出隊。簡單來說就是允許插入的一端稱為隊尾、允許刪除的一端稱為隊頭; 如下圖展示了棧這個數(shù)據(jù)結(jié)構(gòu): JavaScript中的隊列 要知道JavaScript中沒有有關(guān)隊列的數(shù)據(jù)模型,因此我們需要通過數(shù)組進(jìn)行模擬,當(dāng)數(shù)組中提供的push()和shift()選...
閱讀 3454·2021-11-22 12:00
閱讀 672·2019-08-29 13:24
閱讀 2905·2019-08-29 11:31
閱讀 2587·2019-08-26 14:00
閱讀 3185·2019-08-26 11:42
閱讀 2477·2019-08-23 18:31
閱讀 799·2019-08-23 18:27
閱讀 2844·2019-08-23 16:58