JavaScript中的this實例分析
更新時間:2011年04月28日 00:49:57 作者:
做web開發(fā)幾年,也認(rèn)為自己的js寫了不少,可真正去解釋這個東西的時候,才發(fā)現(xiàn)不是這么簡單,花了一些時間,寫了幾個小demo,讓我們來一探究竟。
以人為鏡,可知得失,看來這句話是很有道理的。
Demo 1 :
如果是一個全局的function,則this相當(dāng)于window對象,在function里定義的各種屬性或者方法可以在function外部訪問到,前提是這個function需要被調(diào)用。
<script type="text/javascript">
//在function中使用this
function a() {
if (this == window) {
alert("this == window");
this.fieldA = "I'm a field";
this.methodA = function() {
alert("I'm a function ");
}
}
}
a(); //如果不調(diào)用a方法,則里面定義的屬性會取不到
alert(window.fieldA);
methodA();
</script>
Demo 2 :
如果使用new的方式去實例化一個對象,則this不等于window對象,this指向function a的實例
<script type="text/javascript">
//在function中使用this之二
function a() {
if (this == window) {
alert("this == window");
}
else {
alert("this != window");
}
this.fieldA = "I'm a field";
}
var b = new a();
alert(b.fieldA);
</script>
Demo 3 :
使用prototype擴展方法可以使用this獲取到源對象的實例,私有字段無法通過原型鏈獲取
<script type="text/javascript">
//在function中使用this之三
function a() {
this.fieldA = "I'm a field";
var privateFieldA = "I'm a var";
}
a.prototype.ExtendMethod = function(str) {
alert(str + " : " + this.fieldA);
alert(privateFieldA); //出錯
};
var b = new a();
b.ExtendMethod("From prototype");
</script>
Demo 4 :
不管是直接引用function,還是實例化一個function,其返回的閉包函數(shù)里的this都是指向window
<script type="text/javascript">
//在function中使用this之四
function a() {
alert(this == window);
var that = this;
var func = function() {
alert(this == window);
alert(that);
};
return func;
}
var b = a();
b();
var c = new a();
c();
</script>
Demo 5 :
在HTML中使用this,一般代表該元素本身
<div onclick="test(this)" id="div">Click Me</div>
<script type="text/javascript">
function test(obj) {
alert(obj);
}
</script>
Demo 6 :
在IE和火狐(Chrome)下注冊事件,this分別指向window和元素本身
<div id="div">Click Me</div>
<script type="text/javascript">
var div = document.getElementById("div");
if (div.attachEvent) {
div.attachEvent("onclick", function() {
alert(this == window);
var e = event;
alert(e.srcElement == this);
});
}
if (div.addEventListener) {
div.addEventListener("click", function(e) {
alert(this == window);
e = e;
alert(e.target == this);
}, false);
}
</script>
以上就是我總結(jié)的this在javascript中的不同應(yīng)用場景,可能還有其他的情況不一而足,以后發(fā)現(xiàn)了會補充進來。
Demo 1 :
如果是一個全局的function,則this相當(dāng)于window對象,在function里定義的各種屬性或者方法可以在function外部訪問到,前提是這個function需要被調(diào)用。
復(fù)制代碼 代碼如下:
<script type="text/javascript">
//在function中使用this
function a() {
if (this == window) {
alert("this == window");
this.fieldA = "I'm a field";
this.methodA = function() {
alert("I'm a function ");
}
}
}
a(); //如果不調(diào)用a方法,則里面定義的屬性會取不到
alert(window.fieldA);
methodA();
</script>
Demo 2 :
如果使用new的方式去實例化一個對象,則this不等于window對象,this指向function a的實例
復(fù)制代碼 代碼如下:
<script type="text/javascript">
//在function中使用this之二
function a() {
if (this == window) {
alert("this == window");
}
else {
alert("this != window");
}
this.fieldA = "I'm a field";
}
var b = new a();
alert(b.fieldA);
</script>
Demo 3 :
使用prototype擴展方法可以使用this獲取到源對象的實例,私有字段無法通過原型鏈獲取
復(fù)制代碼 代碼如下:
<script type="text/javascript">
//在function中使用this之三
function a() {
this.fieldA = "I'm a field";
var privateFieldA = "I'm a var";
}
a.prototype.ExtendMethod = function(str) {
alert(str + " : " + this.fieldA);
alert(privateFieldA); //出錯
};
var b = new a();
b.ExtendMethod("From prototype");
</script>
Demo 4 :
不管是直接引用function,還是實例化一個function,其返回的閉包函數(shù)里的this都是指向window
復(fù)制代碼 代碼如下:
<script type="text/javascript">
//在function中使用this之四
function a() {
alert(this == window);
var that = this;
var func = function() {
alert(this == window);
alert(that);
};
return func;
}
var b = a();
b();
var c = new a();
c();
</script>
Demo 5 :
在HTML中使用this,一般代表該元素本身
復(fù)制代碼 代碼如下:
<div onclick="test(this)" id="div">Click Me</div>
<script type="text/javascript">
function test(obj) {
alert(obj);
}
</script>
Demo 6 :
在IE和火狐(Chrome)下注冊事件,this分別指向window和元素本身
復(fù)制代碼 代碼如下:
<div id="div">Click Me</div>
<script type="text/javascript">
var div = document.getElementById("div");
if (div.attachEvent) {
div.attachEvent("onclick", function() {
alert(this == window);
var e = event;
alert(e.srcElement == this);
});
}
if (div.addEventListener) {
div.addEventListener("click", function(e) {
alert(this == window);
e = e;
alert(e.target == this);
}, false);
}
</script>
以上就是我總結(jié)的this在javascript中的不同應(yīng)用場景,可能還有其他的情況不一而足,以后發(fā)現(xiàn)了會補充進來。
相關(guān)文章
JS實現(xiàn)點擊復(fù)選框變更DIV顯示狀態(tài)的示例代碼
下面小編就為大家分享一篇JS實現(xiàn)點擊復(fù)選框變更DIV顯示狀態(tài)的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12JavaScript轉(zhuǎn)換農(nóng)歷類實現(xiàn)及調(diào)用方法
農(nóng)歷是日常生活中不可或缺的一部分,它與人類的生活息息相關(guān),從某種程度上說,它一直伴隨著我們,今天的任務(wù)是JavaScript轉(zhuǎn)換農(nóng)歷類的實現(xiàn),感興趣的你可以千萬不要錯過,希望本文對你有所幫助2013-01-01javascript onkeydown實現(xiàn)鍵盤快捷鍵控制頁面
2008-04-04three.js設(shè)置物體的縮放和旋轉(zhuǎn)代碼示例
最近在用three.js做三維模型的時候,需要通過鼠標(biāo)滑輪向前來控制視角朝鼠標(biāo)的位置放大,然后通過鼠標(biāo)滑輪向后將視角復(fù)原,這篇文章主要給大家介紹了關(guān)于three.js如何設(shè)置物體的縮放和旋轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下2023-11-11