標籤:
new
- 建立一個新對象;
- 將建構函式的範圍賦給新對象(因此this就指向了這個新對象);
- 執行建構函式中的代碼(為這個新對象添加屬性);
- 返回新對象
用代碼描述的話(先別管proyotype, apply等):
1 function New (f) {2 var n = { ‘__proto__‘: f.prototype }; /*第一步*/3 return function () {4 f.apply(n, arguments); /*第二步*/5 return n; /*第三步*/6 };7 }
This
this 是一個指標,永遠指向 父級中最近的一個 的 new 對象 執行個體
在頁面載入時候,javascript 引擎完成 windows 執行個體化, 此時 this 指向 windows;
1 console.log(this === window); // true2 var value = "i‘m proproty of window instance";3 console.log(value === window.value); // true4 function show(){5 console.log(this === window); // true6 }7 show();
只有當 new 一個新對象後,該對象內部的 this 才會全部指向 新的對象;
備忘:var obj = {} 也是new
1 var show = {2 do : function(){3 console.log(this); // obj4 console.log(this === window); // false5 } 6 }7 show.do();
特別注意以下情況:
1 var show = {2 do : function(){3 console.log(this); // window4 console.log(this === window); // false5 } 6 }7 8 var doFun = show.do;9 doFun();
show.do(): do 作為 show 對象的函數被調用。所以,上下文指的是show;
doFun(): show.do 被分配到 doFun變數時,因為 doFun 被隱式設定為全域對象的屬性,因此,doFun 的 上下文指的是 window
Call & Apply
文法:
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
apply([thisObj[,argArray]])
Call和apply是改變函數的範圍(scope/上下文);
將建構函式的範圍賦給新對象(見 new 第二條,此時 this 就指向了這個新對象);
Call 和 apply是將 this 指向方法的第一個參數。
1 var value = "i‘m proproty of window instance"; 2 function show(){ 3 console.log(this); 4 console.log(this.value); 5 } 6 7 var obj = { 8 value : "i‘m proproty of obj instance" 9 };10 11 /* 12 * window13 * i‘m proproty of window instance14 */15 show();16 17 /* 18 * obj19 * i‘m proproty of obj instance20 */21 show.call(obj);
JavaScript 從對象 new 說起,簡單理解 this/call/apply