JavaScript 从对象 new 说起,简单理解 this/call/apply

new 

  1. 创建一个新对象;
  2. 将构造函数的作用域赋给新对象(因此this就指向了这个新对象);
  3. 执行构造函数中的代码(为这个新对象添加属性);
  4. 返回新对象

  用代码描述的话(先别管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);

 

posted @ 2016-04-16 15:23  互联网隐者  阅读(486)  评论(0编辑  收藏  举报