self 關鍵字介紹:
這個非常簡單。我們知道,打開任何一個網頁,瀏覽器會首先創建一個窗口,這個窗口就是一個 window 對象,也是 js 運行所依附的全局環境對象和全局作用域對象。self 指窗口本身,它返回的對象跟window 對像是一模一樣的。也正因為如此,window 對象的常用方法和函數都可以用 self 代替window。舉個例子,常見的寫法如 “self.close();”,把它放在<a>標記中:“<a href="javascript:self.close();">關閉窗口</a>” ,單擊“關閉窗口”鏈接,當前頁面關閉。
this 關鍵字介紹:
在講this之前,看下面的一段代碼:
- <html>
- <body>
- <script type = "text/javascript">
- function thisTest()
- {
- alert("thisTest being called!")
- this.textValue = 'this 的 dom 測試1' ;
- this.element = document.createElement('span');
- this.element.innerHTML = this.textValue;
- this.element.style.color = "blue" ;
- this.element.style.cursor = "pointer" ;
- this.element.onclick=function(){alert( " 單擊我:" + this.textValue)};
- }
- thisTest.prototype.RenderDom
- =function()
- {
- alert("RenderDom being called!")
- document.body.appendChild(this.element);
- };
- //thisTest.prototype.toString
- function toString()
- {
- alert("toString being called!")
- alert( " 單擊我:" + this.textValue);
- };
- var test = new thisTest();
- test.RenderDom();
- // test.ToString();
- </script>
- </body>
- </html>
- < span style ='cursor:pointer;color:blue;' onclick ="alert(this.innerHTML)" > this的dom測試</ span >
this 到底指什麼?
我們熟悉的c#有 this 關鍵字,它的主要作用就是指代當前對象實例(參數傳遞和索引器都要用到 this)。在 javascript 中,this 通常指向的是我們正在執行的函數本身,或者是指向該函數所屬的對象(運行時)。常見使用方式有直接在dom元素中使用:
- <input id ="btnTest" type ="button" value ="提交" onclick ="alert(this.value))" />
- 不正確的方式
- <script type = " text/javascript ">
- function thisTest(){
- alert( this .value); // 彈出undefined, this在這裡指向??
- }
- </script>
- < input id = "btnTest" type=" button" value = " 提交" onclick = "thisTest()" />
- 正確的方式
- <input id=" btnTest " type="button" value="提交" />
- <script type = " text/javascript">
- function thisTest(){
- alert( this .value);
- }
- document.getElementById( " btnTest " ).onclick = thisTest; // 給button的onclick事件註冊一個函數
- </script>
另外類定義中使用 this 關鍵字再常見不過,看範例:
- function thisTest()
- {
- var tmpName = 'jeff wong' ;
- this.userName = 'jeff wong' ;
- }
- var test = new thisTest();
- alert(test.userName == test.tmpName); // false
- alert(test.userName); // jeff wong
- alert(test.tmpName); // undefined
this 也可使用來為腳本對象添加原形方法. 理解這裡的前提是你必須了解js裡的原型概念:js 中對象的 prototype 屬性,是用來返回對象類型原型的引用的。所有 js 內部對像都有隻讀的 prototype 屬性,可以向其原型中動態添加功能 (屬性和方法),但該對像不能被賦予不同的原型。但是對於用戶定義的對象可以被賦給新的原型。看個簡單的範例:
- // js的內部對象String,向其原型中動態添加功能(屬性和方法)
- // 去掉字符串兩端的空白字符
- String.prototype.Trim = function () {
- return this.replace( / (^\s+) |(\s+$) / g, "" );
- }
- function thisTest()
- {
- var tmpName = ' jeff wong ' ;
- this.userName = ' jeff wong ' ;
- }
- // 給用戶定義的對象添加原型方法
- thisTest.prototype.ToString = function ()
- {
- alert( this.userName); // jeff wong(*有空格*)
- alert( this.userName.Trim()); // jeff wong (*無空格*)
- // alert(tmpName ); //腳本錯誤,tmpName未定義
- }
- var test = new thisTest();
- test.ToString(); // 調用原型的ToString()
- function myTest(){
- this .userName = ' test ' ;
- }
- var test1 = new myTest();
- // test1.ToString(); //這裡暫時不支持調用 ToString() 方法
- // 用戶定義的對像被賦給新的原型
- myTest.prototype = new thisTest();
- test1.ToString() ; // 調用原型的ToString()
你也可以在函數的內部函數中使用 this 關鍵字. 這個你要是理解 作用域 和 閉包 (Closure),問題就迎刃而解。看最典型的範例:
- function thisTest()
- {
- this.userName = ' outer userName ' ;
- function innerThisTest(){
- var userName = " inner userName " ;
- alert(userName); // inner userName
- alert( this.userName); // outer userName
- }
- return innerThisTest ;
- }
- thisTest()();
最後一個用法是你可以通過 Function 的 call 和 apply 函數指定特定的 this. 這個指定來指定去,this就有可能造成“你中有我,我中有你”的局面,不想把自己弄暈了的話,了解一下就可以了。改變 this指定對像對於代碼維護也是一件很不好的事情. 範例代碼如下:
- function myFuncOne() {
- this.p = " myFuncOne- " ;
- this.A = function (arg) {
- alert( this.p + arg);
- }
- }
- function myFuncTwo() {
- this.p = " myFuncTwo- " ;
- this.B = function (arg) {
- alert( this.p + arg);
- }
- }
- function test() {
- var obj1 = new myFuncOne();
- var obj2 = new myFuncTwo();
- obj1.A( " testA " ); // 顯示myFuncOne-testA
- obj2.B( " testB " ); // 顯示myFuncTwo-testB
- obj1.A.apply(obj2, [ " testA " ]); // 顯示myFuncTwo-testA,其中[ testA”]是僅有一個元素的數組
- obj2.B.apply(obj1, [ " testB " ]); // 顯示myFuncOne-testB,其中[ testB”]是僅有一個元素的數組
- obj1.A.call(obj2, " testA " ); // 顯示myFuncTwo-testA
- obj2.B.call(obj1, " testB " ); // 顯示myFuncOne-testB
- }
沒有留言:
張貼留言