zoukankan      html  css  js  c++  java
  • this小记

    this小记

    太久没有研究底层的js相关,今晚差点被紫红爸爸上课了。

    正题

    var net=new Object();  //定义一个全局变量net
    net.AjaxRequest=function(url,onload,onerror,method,params){//创建一个构造函数
      this.req=null;
      this.onload=onload;
      this.onerror=(onerror) ? onerror : this.defaultError;
      this.loadDate(url,method,params);
    }
    

    this指向什么?是net.AjaxRequest还是net?刚开始没想起来答错了,说了net.AjaxRequest。其实这段代码的本质跟下面这段是一样的

    var obj = {
            name:"qiangzi",
            show:function(){
                console.log(this.name);
            }
    };
    obj.show();
    

    很明显,obj.show()的this指向调用该方法的对象,也即是obj,所以上面的代码其实也就是这样

    var net = {
            AjaxRequest: function (url, onload, onerror, method, params) {//创建一个构造函数
                this.req = null;
                this.onload = onload;
                this.onerror = (onerror) ? onerror : this.defaultError;
                this.loadDate(url, method, params);
            }
        };
    net.AjaxRequest();
    

    所以,很明显,上面的代码中,AjaxRequest的this指向就是net

    然后紫红给我看了这图

    图很可怕,但其实内容很简单,简化的问题如下

    输出结果

    根据上文分析,net.athis指向net,所以net.a内部调用this.b(),实际上就是指net.b()。但是,我们的b方法是加在net.a的原型上,而不是net的原型上,所以很明显,调用net.a()的时候输出结果是this.b is not a function

    解决方法

    为了能够正确的运行b方法,我们先试着把b方法加到net的原型上

    var net = {
            a:function(){
                this.b();
            }
        };
        net.prototype.b=function(){
            console.log("success")
        };
        net.a()
    

    结果,浏览器报错

    Uncaught TypeError: Cannot set property 'b' of undefined
    

    由于我们的net是对象,而对象上是无法添加原型的,所以这里就报错了,最后我们用了new来解决

    var net = {
        a:function(){
            this.b();
            console.log(this);
        }
    };
    net.a.prototype.b=function(){
        console.log("success");
    };
    new net.a();
    

    输出

    success
    
    net.a {}
    

    可以看出,new改变了我们的this指向,至于具体的用法以及原因,有时间再做探究。

  • 相关阅读:
    python拆分pubchem SDF文件
    zlib压缩爬虫采集到的网页源码保存到mongodb减少存储空间
    openresty (lua-nginx_static_merger)合并css js文件 减少请求次数,提升页面速度
    scrapy采集—爬取中文乱码,gb2312转为utf-8
    不写代码的爬虫
    爬虫如何发现更多的url呢,怎么动态收集新的url连接
    python 将GIF拆分成图片方法
    Linux shell循环遍历
    iOS 11 导航栏放置UISearchBar 导航栏高度变高解决办法 (iPhone X出现的情况)
    隐藏UISearchBar中的删除按钮
  • 原文地址:https://www.cnblogs.com/jelly7723/p/5599230.html
Copyright © 2011-2022 走看看