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); // true 2 var value = "i'm proproty of window instance"; 3 console.log(value === window.value); // true 4 function show(){ 5 console.log(this === window); // true 6 } 7 show();
只有当 new 一个新对象后,该对象内部的 this 才会全部指向 新的对象;
备注:var obj = {} 也是new
1 var show = { 2 do : function(){ 3 console.log(this); // obj 4 console.log(this === window); // false 5 } 6 } 7 show.do();
特别注意以下情况:
1 var show = { 2 do : function(){ 3 console.log(this); // window 4 console.log(this === window); // false 5 } 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 * window 13 * i'm proproty of window instance 14 */ 15 show(); 16 17 /* 18 * obj 19 * i'm proproty of obj instance 20 */ 21 show.call(obj);