js中的this(3)

本文討論如何“修改”function中的this

有兩個(gè)要點(diǎn):
(1)為什么要修改怀酷?
關(guān)鍵字:共享
(2)如何修改次泽?
關(guān)鍵字:call,apply,bind

如何修改

前面提到 this是一個(gè)對象烟勋,并且 是只讀的:你不能手動(dòng)修改this的值蚌卤。

<script>
    this = {};//這是錯(cuò)誤的
</script>

那為什么我們要如何去修改this的值呢?
使用call幽钢。

call是什么歉备?

call是Function.prototype的一個(gè)屬性。在chrome瀏覽器的控制臺(tái)中輸入如下:

console.dir(Function.prototype)

你就可以看到:


image.png

上圖中還有apply,后面我們會(huì)說到匪燕。

解釋一下上面的那一句代碼蕾羊。
Function是js的內(nèi)置對象,是一個(gè)構(gòu)造器帽驯,js中所有的function都是由它創(chuàng)造出來的龟再。prototype是Function的原型對象,call是 prototype的一個(gè)屬性尼变。因?yàn)樗膶傩灾凳呛瘮?shù)利凑,更準(zhǔn)確地來說,它是一個(gè)方法享甸。

按原型鏈的規(guī)則:定義在Function.prototype對象中的屬性 可以被任意的function使用截碴。

call的作用和格式

作用

修改函數(shù)內(nèi)部的this。

格式

函數(shù)f.call(newObj蛉威,參數(shù)1,參數(shù)2.....)
形參:
   newObj          :用newObj替換函數(shù)f中的this
   參數(shù)1...參數(shù)n  : 函數(shù)f 的參數(shù)走哺。

示例

function f(){ console.info( this.p);}
var obj1 = {"p":"obj1"}
var obj2 = {"p":"obj2"}

f.call(obj1 ); //輸出obj1
f.call(obj2 ); //輸出obj2

對f.call(obj1) 解釋如下:
(1)調(diào)用函數(shù)f蚯嫌。
(2)用obj1來替換函數(shù)f中的this。

為什么要替換函數(shù)中的this?

關(guān)鍵字:共享丙躏。
函數(shù)是動(dòng)態(tài)的择示,它可以執(zhí)行特定的功能。
對象是屬性的集合晒旅,它用來保持復(fù)雜的數(shù)據(jù)栅盲,當(dāng)然,它也有自己的方法废恋。

call的意義在于:把函數(shù)共享出來谈秫,讓多個(gè)對象來共同使用。
示例:

var obj1 = {
  "p":"obj1",
  "f":function(){console.info(this.p);}
}
var obj2 = {
   "p":"obj2",
   "f":function(){console.info(this.p);}
}

上面定義了兩個(gè)對象鱼鼓,它們的結(jié)構(gòu)大致相同拟烫。
我們通過調(diào)用他們各自的f方法去訪問它們的p屬性:

obj1.f();//obj1
obj2.f();//obj2

上面的代碼中,obj1,obj2中保存的f屬性是完全一樣的迄本,但在內(nèi)存是保存了兩份拷貝:

obj1.f === obj2.f硕淑;//false

這是浪費(fèi)空間。可以改進(jìn)一下:

function f(){console.info(this.p);}
var obj1 = {
  "p":"obj1",
  "f":f
}
var obj2 = {
   "p":"obj2",
   "f":f
}
//如下效果是一樣的
obj1.f();//obj1
obj2.f();//obj2

改進(jìn)之在于:

obj1.f === obj2.f置媳;//true

如果你連這個(gè)f屬性都不想要于樟,則就可以把代碼寫成我們前面的樣子:

function f(){ console.info( this.p);}
var obj1 = {"p":"obj1"}
var obj2 = {"p":"obj2"}

f.call(obj1 ); //輸出obj1
f.call(obj2 ); //輸出obj2

保持對象中只存數(shù)據(jù),而具體的操作通過借用函數(shù)來實(shí)現(xiàn)拇囊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迂曲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寂拆,更是在濱河造成了極大的恐慌奢米,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纠永,死亡現(xiàn)場離奇詭異鬓长,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)尝江,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門涉波,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炭序,你說我怎么就攤上這事啤覆。” “怎么了惭聂?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵窗声,是天一觀的道長。 經(jīng)常有香客問我辜纲,道長笨觅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任耕腾,我火速辦了婚禮见剩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扫俺。我一直安慰自己苍苞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布狼纬。 她就那樣靜靜地躺著羹呵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畸颅。 梳的紋絲不亂的頭發(fā)上担巩,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音没炒,去河邊找鬼涛癌。 笑死犯戏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拳话。 我是一名探鬼主播先匪,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弃衍!你這毒婦竟也來了呀非?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤镜盯,失蹤者是張志新(化名)和其女友劉穎岸裙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體速缆,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡降允,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艺糜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剧董。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖破停,靈堂內(nèi)的尸體忽然破棺而出翅楼,到底是詐尸還是另有隱情,我是刑警寧澤真慢,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布毅臊,位于F島的核電站,受9級(jí)特大地震影響黑界,放射性物質(zhì)發(fā)生泄漏褂微。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一园爷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧式撼,春花似錦童社、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至美浦,卻和暖如春弦赖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浦辨。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工蹬竖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓币厕,卻偏偏與公主長得像列另,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子旦装,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 單例模式 適用場景:可能會(huì)在場景中使用到對象页衙,但只有一個(gè)實(shí)例,加載時(shí)并不主動(dòng)創(chuàng)建阴绢,需要時(shí)才創(chuàng)建 最常見的單例模式店乐,...
    Obeing閱讀 2,067評論 1 10
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情呻袭,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式眨八。簡單...
    舟漁行舟閱讀 7,758評論 2 17
  • 繼承 一、混入式繼承 二棒妨、原型繼承 利用原型中的成員可以被和其相關(guān)的對象共享這一特性踪古,可以實(shí)現(xiàn)繼承,這種實(shí)現(xiàn)繼承的...
    magic_pill閱讀 1,062評論 0 3
  • 人的心情會(huì)跟著周圍的人或事發(fā)生改變券腔,有著抱怨心里是什么也做不好的伏穆,所以我們不應(yīng)該做抱怨著,當(dāng)負(fù)能量的傳播者纷纫,相反枕扫,...
    23aae7e9bc8e閱讀 77評論 0 0
  • 夜深而落的詩 夜深而羅的事 夜已深了 你還沒去睡么 你在想些什么 在如此的深夜里 你除了睡眠和生存 還會(huì)想些什么 ...
    洛秋白閱讀 262評論 1 1