• JS apply() call() bind()方法的使用


    一、apply()方法和call()方法的异同点:

    • 相同点:
      • apply和call都可以改变this的指向
      • 方法的功能是一样的
    • 不同点:
      • 参数传递的方式是不一样的,即第二个参数是不一样的,apply()只能传两个参数,且第二个参数以数组形式传递,call()方法可以传入多个参数

    下面各自介绍:

    • apply()方法

    1.使用语法:

    函数名字.apply(对象,[参数1,参数2,...])   FunctionName.apply(Obj, [para1, para2, ...])
    方法名字.apply(对象,[参数1,参数2,...])   ObjectName.apply(Obj, [para1, para2, ...])

    2.使用案例:

    function f1(x, y) {
      console.log((x + y) + ":===>" + this);
    }
    var r1 = f1.apply(null, [1, 2]); //此时f1中的this是window
    console.log(r1); // 3:===>[object Window]  
    
    console.log("==============================");
    //改变this的指向 var obj = { sex: "男" }; //本来f1函数是window对象的,但是传入obj之后,f1函数此时就是obj对象的 var r2 = f1.apply(obj, [1, 2]); //此时f1中的this是obj console.log(r2); // 3:===>[object Object]

    console.log("==============================");

    function Person(age) {
      
    this.age = age;
    }
    Person.prototype.sayHi
    = function (x, y) {
      console.log((x
    + y) + ":====>" + this.age);
    };
    function Student(age) {
      this.age = age;
    }
    var per = new Person(10); //实例对象
    var stu = new Student(100); //实例对象
    //
    sayHi方法是per实例对象的
    per.sayHi.apply(stu, [10, 20]); // 30:====>100
    • call()方法

    1.使用语法:

    函数名字.call(对象,参数1,参数2,...)  FunctionName.call(Obj, para1, para2, ...)

    方法名字.call(对象,参数1,参数2,...)  ObjectName.call(Obj, para1, para2, ...)

    2.使用案例:

    function f1(x, y) {
      console.log((x + y) + ":===>" + this);
    }
    var r1 = f1.call(null, 1, 2); //此时f1中的this是window
    console.log(r1); // 3:===>[object Window]  
    
    console.log("==============================");
    
    //改变this的指向
    var obj = {
      sex: "男"
    };
    //本来f1函数是window对象的,但是传入obj之后,f1函数此时就是obj对象的
    var r2 = f1.call(obj, 1, 2); //此时f1中的this是obj
    console.log(r2); // 3:===>[object Object]
    
    console.log("==============================");
    
    function Person(age) {
      this.age = age; 
    } 
    Person.prototype.sayHi = function (x, y) {
      console.log((x + y) + ":====>" + this.age);
    }; 
    function Student(age) {
      this.age = age;
    } 
    var per = new Person(10); //实例对象 
    var stu = new Student(100); //实例对象 
    //sayHi方法是per实例对象的 
    per.sayHi.call(stu, 10, 20); // 30:====>100

    二、bind()方法

    bind()方法是复制的作用,同时bind()方法也可以改变this指向,需注意的是:

    bind()方法返回的是一个函数

    1.使用语法:

    函数名字.bind(对象,参数1,参数2,...)  FunctionName.bind(Obj, para1, para2, ...)

    方法名字.bind(对象,参数1,参数2,...)  ObjectName.bind(Obj, para1, para2, ...)

    2.使用案例:

    function f1(x, y) {
      console.log((x + y) + ":=====>" + this.age);
    }
    var ff1 = f1.bind(null);
    ff1(10, 20); // 30:=====>undefined
    // 复制了一份的时候,把参数传入到了f1函数中,x=10,y=20,null就是this,默认就是window
    console.log("==========================");
    
    function Person(age) {
      this.age = 1000;
    }
    Person.prototype.eat = function () {
      console.log("吃美食");
    };
    var per = new Person();
    var ff2 = f1.bind(per, 10, 20);
    ff2(); // 30:=====>1000
    
    console.log("==========================");
    
    function Teacher(age) {
      this.age = age;
    }
    Teacher.prototype.play = function () {
      console.log(this + "====>" + this.age);
    };
    function Student(age) {
      this.age = age;
    }
    var per = new Teacher(10);
    var stu = new Student(20);
    //复制了一份
    var ff3 = per.play.bind(stu);
    ff3(); //[object Object]====>20
     
  • 相关阅读:
    javascript Date format(js日期格式化)
    hcharts 教程
    UVA 10594 Data Flow
    UVA 10746 Crime Wave
    UVA 753 A Plug for UNIX
    UVA 11045 My T-shirt suits me
    UVA 10273 Eat or not to Eat?
    UVA 10806 Dijkstra, Dijkstra.
    UVA 10330 Power Transmission
    UVA 10803 Thunder Mountain
  • 原文地址:https://www.cnblogs.com/muzidaitou/p/12520139.html
Copyright © 2020-2023  润新知