面對對象(三)this 關鍵字

涵義
實質
使用場合
使用注意點
避免多層 this
避免數組處理方法中的 this
避免回調函數中的 this
綁定 this 的方法
Function.prototype.call()
Function.prototype.apply()
Function.prototype.bind()
參考連接編程

1.涵義
this就是屬性或方法「當前」所在的對象。
只要函數被賦給另外一個變量,this的指向就會變。數組

var A = {
name: '張三',
describe: function () {瀏覽器

return '姓名:'+ this.name;

}
};數據結構

var name = '李四';
var f = A.describe;
f() // "姓名:李四"
上面代碼中,A.describe被賦值給變量f,內部的this就會指向f運行時所在的對象(本例是頂層對象)。app

再看一個網頁編程的例子。函數

<input type="text" name="age" size=3 onChange="validate(this, 18, 99);">this

<script>
function validate(obj, lowval, hival){
if ((obj.value < lowval) || (obj.value > hival))prototype

console.log('Invalid Value!');

}
</script>
上面代碼是一個文本輸入框,每當用戶輸入一個值,就會調用onChange回調函數,驗證這個值是否在指定範圍。瀏覽器會向回調函數傳入當前對象,所以this就表明傳入當前對象(即文本框),而後就能夠從this.value上面讀到用戶的輸入值。
2.實質設計

JavaScript 語言之因此有 this 的設計,跟內存裏面的數據結構有關係。code

var obj = { foo: 5 };
上面的代碼將一個對象賦值給變量obj。JavaScript 引擎會先在內存裏面,生成一個對象{ foo: 5 },而後把這個對象的內存地址賦值給變量obj。也就是說,變量obj是一個地址(reference)。後面若是要讀取obj.foo,引擎先從obj拿到內存地址,而後再從該地址讀出原始的對象,返回它的foo屬性。

2.1屬性結構保存
原始的對象以字典結構保存,每個屬性名都對應一個屬性描述對象。舉例來講,上面例子的foo屬性,其實是如下面的形式保存的。

{
foo: {

[[value]]: 5
[[writable]]: true
[[enumerable]]: true
[[configurable]]: true

}
}
注意,foo屬性的值保存在屬性描述對象的value屬性裏面。

var obj = { foo: function () {} };
這時,引擎會將函數單獨保存在內存中,而後再將函數的地址賦值給foo屬性的value屬性。

{
foo: {

[[value]]: 函數的地址
...

}
}

2.2函數的this
this,它的設計目的就是在函數體內部,指代函數當前的運行環境。

3.使用場合
(1)全局環境
只要是在全局環境下運行,this就是指頂層對象window
(2)構造函數
構造函數中的this,指的是實例對象
因爲this指向實例對象,因此在構造函數內部定義this.p,就至關於定義實例對象有一個p屬性
(3)對象的方法
若是對象的方法裏面包含this,this的指向就是方法運行時所在的對象。該方法賦值給另外一個對象,就會改變this的指向

4.使用注意點
5.避免多層 this
6.避免數組處理方法中的 this
7.避免回調函數中的 this
8.綁定 this 的方法
Function.prototype.call()
Function.prototype.apply()
Function.prototype.bind()
9.參考連接

this.property

相關文章
相關標籤/搜索