zoukankan      html  css  js  c++  java
  • js---13 this call apply

    //this:this可以写在js全剧环境中(全局环境中this是window对象),this可以写在函数中,可以写在对象中,
    function f(){
         this.name = "asdfas";
    }
    var o ={
        name :"cj",
         print:function(){
            console.log(this.name);
        }
    };
    o.print();//cj
    var f = o.print();//java的内存分析模型来分析js内存模型。函数也有地址,f就指向print指向的函数对象,
    f();//undefined,
    /*this是运行时决定不是代码写的时候决定,this写在函数中,哪个对象调用函数, ,this就指向那个对象,  f() === window.f(),所以未定义。
    */
    
    var ele = document.getElementById("id");
    ele.addEventListener("click",function(){
        console.log(this);//this永远指向dom元素,就是引发事件的对象,
    })
    
    //call,apply都是函数对象有的,动态改变函数调用的对象
    function log(a){
        console.log(this[a]);
    }
    log("name");  //this是window对象,global
    log.call(o,"name");//cj,相当于o.log("name"),不让window调用log函数让o来调用log函数,call方法第一个参数是要调用这个函数的对象,第二个是参数。
    
    function log(a,b){
         console.log(this[a]);//通过中括号访问函数对象的成员属性,
         console.log(this[b]);
    }
    log("name","");
    log.apply(o,"name","age");
    log.apply(o,["name","age"]); //apply接受参数是数组,call是一个一个传递
    
    log.call(this,)  == this.log()
    
    
    
    
    
    function p(){
        this.name = "111";//函数的this是调用这个函数的对象
    }
    var d = p();//单纯函数执行不会返回对象,除非函数里面返回了函数就是返回子类对象,
    console.log(d.name);//name未定义
    var o ={}; p.call(o);//相当于o.p(), this就指向o,然后增加一个属性name console.log(o.name); // 111 function Person(name,age){ this.name = name; this.age = age; } var p1 = new Person ("cj",22);//new出来的,当然p1就是这个函数类的实例化对象 console.log(p1 instanceof Person); //true //自定义new function New(f){ //f 是个函数。f 构造器函数 var o = {"__proto__":f.prototype}; //o.__proto__ 指向函数f的prototype return function(){//返回函数,可以不写形参,按照java父类子类思维,每次return的函数地址是不一样的,就像return多个子类对象, //o.name = arguments[0]; //o.age = arguments[1]; f.apply(o,arguments);//o调用f,f函数里面的this就是o了,o就有了f函数的成员属性和值 return o;//函数执行时返回o对象 } } var p2 = New(Person)("xx",33);//New(Person)返回函数,("xx",33)函数执行返回o console.log(p2.name);//xx console.log(p2 instanceof Person);//true </script>
      // java的面向对象思维来分析js函数闭包而已,函数成员属性的作用范围也用java父子类思维来分析
      //函数的嵌套,产生的闭包的作用范围,类似于父类子类对象堆的作用域范围。return函数出去,每次return都是一个新的函数地址(产生新的闭包)
      function New(f){ //类1
          var o = {"__proto__":f.prototype};  //对象2,对象的组合
          return function(){ //类3
              f.apply(o,arguments);           
            return o;//函数执行时返回o对象
          }
      }
      var temp = New(Person); //window.New(Person),函数1执行,return function()返回函数3地址就是对象3
      var p2 = temp("11",11);  //window.temp("11",11),函数3执行, ,返回对象2,
      var p3 = temp("22",22);// 函数3执行,返回对象2, p2,p3是同一个对象o
      console.log(p2.name);  //22
      console.log(p3.name);  // 22
      
      
      function New(f){//对象1
          return function(){//对象3
              var o = {"__proto__":f.prototype};//对象2,对象的组合
              f.apply(o,arguments);          
            return o;
          }
      }
      var temp = New(Person);//返回对象3 
      var p2 = temp("11",11); //函数3执行,返回对象2,这个对象
      var p3 = temp("22",22); 
      console.log(p2.name);  //11
      console.log(p3.name);  // 22
  • 相关阅读:
    window 删除文件提示指定的文件名无效或太长
    glib-2.40编译安装
    《Android权威编程指南(The Big Nerd Ranch Guide)(第二版)》12.4挑战练习
    Kotlin中when表达式的使用:超强的switch(KAD 13)
    Kotlin将Realm提升到更高层次
    Kotlin中的“忍者”函数 —— 理解泛型的能力(KAD 12)
    Kotlin中功能操作与集合(KAD 11)
    Kotlin的数据类:节省很多行代码(KAD 10)
    在Android中用Kotlin的Anko运行后台任务(KAD 09)
    Kotlin的扩展函数:扩展Android框架(KAD 08)
  • 原文地址:https://www.cnblogs.com/yaowen/p/6846849.html
Copyright © 2011-2022 走看看