• 手机版

    扫码体验手机版

  • 微信公众号

    扫码关注公众号

国内首家协议开发

软芯音视解码保护平台

在线
客服

发布
需求

在线
聊天

天盟
APP

天盟APP下载

关注
微信

微信扫一扫访问
顶部

javascript面向对象题目

window.a=300;
    function fn1(){
      this.a=100;
      this.b=200;
      return function(){
        alert(this.a);
      }.call(arguments[0]);
    }
    function fn2(){
      this.a=new fn1();
    }
    var a=new fn1().b;//300
        //{a:100,b:200}.b
    //a=200
    var v=new fn1(fn2());
          //200 [object Object]
    //fn2(): a={a:100,b:200}
    //v:{a:100,b:200}
双斜扛后面是输出结果
为什么是这样啊?js引擎到底怎么走的?

免责声明:本内容仅代表回答会员见解不代表天盟观点,请谨慎对待。

版权声明:作者保留权利,不代表天盟立场。

使用道具 举报

全部参与1

首先,this是在创建的时候调用
  先看new fn1(),就是对fn1创建了个实例,指向fn1.prototype,因此this.a=100,this.b=200中的this就是fn1.prototype,也就是fn1,因此
newfn1().a=100;newfn1().b=200;  接下来是return function(){};这么写相当于将函数返回出去,相当于在全局作用域中创建一个function,当进行到return function这一步,这个函数里面的this已经是window了,不再是fn1;而.call(arguments[0])的意思是如果存在第一个参数,则将这个return的函数中的this绑定为第一个参数;
现在开始,
第一步,执行var a=new fn1().b,(第一个实例)
alert(this.a)是属于return function中的,是在创建实例的过程中执行,而var a=new fn1().b;是实例创建好后,再去查找b的值,所以先执行alert(this.a);
因为没有赋予参数,所以return function中的this就是window,因此alert(this.a)弹出300;new fn1().b为200,所以经过var a=new fn1().b后,
window.a=200;newfn1()={a:100,b:200}第二步,执行new fn1(fn2()),参数是fn2(),因此call()方法将fn1()里面return的函数中的this绑定为fn2();因此创建实例(第二个实例)中的alert(this.a),就是alert(fn2().a),也就是alert(new fn1()),再次创建fn1实例(第三个实例),因为window.a是200,
因此创建实例中(第三个实例)的alert(this.a)弹出为200(步骤与第一步一样);
第三个实例创建完毕,继续执行第二个实例中alert(new fn1())中的这个alert;new fn1()就是{a:100,b:200},
因此弹出[object Object],其实内部就是{a:100,b:200},可用console.log查看;
弹完2个alert,实例(第二个实例)创建完成,
window.a=200;newfn1()={a:100,b:200}v={a:100,b:200}

使用道具 举报

发新帖

发布任务需求已有1031167位用户正在使用天盟网服务

发布分类: *
任务预算: *
需求内容: *
手机号码: *
任务商家报价为
  • 预算价 :
  • 成交价 :
  • 完工期 :
  • 质保期 :

* 最终任务项目以服务商报价、双方协商为准!