JS 里為什么會(huì)有 this
1、需求
假設(shè)我們有一個(gè)對(duì)象
var person = {
name: 'Frank',
age: 18,
phone: '13812345678',
sayHi: function(){
// 待補(bǔ)充
},
sayBye: function(){
// 待補(bǔ)充
}
}
這個(gè) person 對(duì)象有 name 和 age 屬性,還有一個(gè) sayHi 方法,現(xiàn)在的需求是:
調(diào)用
person.sayHi(...),打印出「你好,我是Frank,今年 18 歲」。
調(diào)用person.sayBuy(...),打印出「再見,記得我叫Frank哦,想約我的話打電話給我,我的電話是 13812345678」
需
求就是這么簡(jiǎn)單,通過達(dá)成這個(gè)需求,我們就能理解 this 的本質(zhì)。
2、方案
var person = {
...
sayHi: function(name, age){
console.log('你好,我是 ${name},今年 ${age} 歲')
},
sayBye: function(name, phone){
console.log('再見,記得我叫 ${name} 哦,想約我的話打電話給我,我的電話是 ${phone}')
}
}
調(diào)用方式是
person.sayHi(person.name, person.age) person.sayBye(person.name, person.phone)
別急,我知道這代碼很傻,接下來改進(jìn)。
3、第一次改進(jìn)
上面方法中,每次都要在調(diào)用的時(shí)候自行選擇 person.name 作為參數(shù),真的很傻,不如直接傳入一個(gè) person,代碼如下:
var person = {
...
sayHi: function(self){
console.log('你好,我是 ${self.name},今年 ${self.age} 歲')
},
sayBye: function(self){
console.log('再見,記得我叫 ${self.name} 哦,想約我的話打電話給我,我的電話是 ${self.phone}')
}
}
調(diào)用方式是
person.sayHi(person) person.sayBye(person)
稍微好一點(diǎn)了,但是這代碼依然很傻。
為什么不能把參數(shù)里的 person 省掉,變成 person.sayHi() 就好了。
4、加糖
開發(fā)者最想要的調(diào)用方式是 person.sayHi()那么問題來了,如果 ,person.sayHi() 沒有實(shí)參,person.sayHi 函數(shù)是如何接收到 person 的呢?
- 方法1:依然把第一個(gè)參數(shù)
self當(dāng)做person,這樣形參就會(huì)永遠(yuǎn)比實(shí)參多出一個(gè) self - 方法2:隱藏
self,然后用關(guān)鍵字this來訪問self。
JS 之父選擇了方法2,用 this 訪問 self。Python 之父選擇了方法1,留下 self 作為第一個(gè)參數(shù)。
過程如下:
// 用 this 之前:
sayHi: function(self){
console.log('你好,我是 ${self.name},今年 ${self.age} 歲')
}
// 用 this 之后:
sayHi: function(){
// this 就是 self
console.log('你好,我是 ${this.name},今年 ${this.age} 歲')
}
5、費(fèi)解
用了 this 之后,完整代碼如下:
var person = {
name: 'Frank',
age: 18,
phone: '13812345678',
sayHi: function(){
console.log('你好,我是 ${this.name},今年 ${this.age} 歲')
},
sayBye: function(){
console.log('再見,記得我叫 ${this.name} 哦,想約我的話打電話給我,我的電話是 ${this.phone}')
}
}
現(xiàn)在輪到新手疑惑了,這個(gè) this 到底是個(gè)啥玩意兒?從哪來的呀?
實(shí)際上 this 是隱藏的第一個(gè)形參。在你調(diào)用 person.sayHi() 時(shí),這個(gè) person 會(huì)「變成」 this。
6、存在問題
很多 JS 高手不屑于用 this,覺得 this 不夠單純。所以 JS 之父給高手們準(zhǔn)備了無糖的 .call 方法。
person.sayHi.call(person) 就等價(jià)于 person.sayHi()
.call 的第一個(gè)參數(shù)就是顯式的 person,沒有任何語法糖。
所以高手一般用 obj.fn.call(null,1,2,3) 來手動(dòng)禁用 this。
這樣一來 person.sayHi.call 的參數(shù)其實(shí)可以是任何對(duì)象。
也就是說 person.sayHi 雖然是 person 的方法,但是是可以調(diào)用在任何對(duì)象上的。
7、對(duì)象與函數(shù)
JS 沒有類沒有方法,只有對(duì)象和函數(shù)。
JS 加了 class 關(guān)鍵字之后,勉強(qiáng)弄出來一個(gè)假的類。
this 是連接對(duì)象和函數(shù)的橋梁。
相比于 JS,我更喜歡 Python 的方式,不使用 this 關(guān)鍵字,而是使用 self 形參,更易懂。
到此這篇關(guān)于JS 里為什么會(huì)有 this的文章就介紹到這了,更多相關(guān)JS 里為什么會(huì)有 this內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript實(shí)現(xiàn)字典Dictionary示例基礎(chǔ)
這篇文章主要為大家介紹了javascript實(shí)現(xiàn)字典Dictionary基礎(chǔ)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
微信小程序支付之c#后臺(tái)實(shí)現(xiàn)方法
這篇文章主要介紹了微信小程序支付之c#后臺(tái)實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10
Hardhat進(jìn)行合約測(cè)試環(huán)境準(zhǔn)備及方法詳解
這篇文章主要為大家介紹了Hardhat進(jìn)行合約測(cè)試環(huán)境準(zhǔn)備及方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
微信小程序 刪除項(xiàng)目工程實(shí)現(xiàn)步驟
這篇文章主要介紹了微信小程序 刪除項(xiàng)目工程實(shí)現(xiàn)步驟的相關(guān)資料,這里對(duì)刪除小程序的步驟進(jìn)行詳解和注意事項(xiàng),需要的朋友可以參考下2016-11-11
微信小程序 解決請(qǐng)求服務(wù)器手機(jī)預(yù)覽請(qǐng)求不到數(shù)據(jù)的方法
這篇文章主要介紹了微信小程序 解決請(qǐng)求服務(wù)器手機(jī)預(yù)覽請(qǐng)求不到數(shù)據(jù)的方法的相關(guān)資料,配置https時(shí),要使用443端口,就可以解決,需要的朋友可以參考下2017-01-01
一個(gè)很簡(jiǎn)單的辦法實(shí)現(xiàn)TD的加亮效果.
一個(gè)很簡(jiǎn)單的辦法實(shí)現(xiàn)TD的加亮效果....2006-06-06

