• 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);
  • 相关阅读:
    linux安装lamp/lamp/lanmp
    git命令
    redis常问面试题
    liunx 项目发布(django + uwsgi + nginx+supervisor发布web服务器)
    安装nginx
    liunx安装mysql(mariadb)
    linux安装python3
    scrapy框架day01
    网络编程, socket用法
    面向对象进阶
  • 原文地址:https://www.cnblogs.com/iceJava/p/5398496.html
Copyright © 2020-2023  润新知