js:apply、call、bind

 function fruits(){}
    fruits.prototype = {
      color:"red",
      say:function(){
        console.log(this.color)
      }
    }
    var apple = new fruits()
    apple.say()

    // 但是如果我们有一个对象banana= {color : "yellow"} ,我们不想对它重新定义 say 方法
    var banana ={
      color:"yellow"
    }
    apple.say.call(banana)
    apple.say.apply(banana)

    //apply、call实例
    // 数组之间追加
    var array1 = [12 , "foo" , {name:"Joe"} , -2458]; 
    var array2 = ["Doe" , 555 , 100]; 
    Array.prototype.push.apply(array1, array2); 
    console.log("array1:"+array1)

    // 获取数组中的最大值和最小值
    var  numbers = [5, 458 , 120 , -215 ]; 
    var maxNumbers1 = Math.max.apply(Math,numbers)
    var maxNumbers2 = Math.max.call(Math,5, 458 , 120 , -215)
    console.log("maxNumbers1:"+maxNumbers1)
    console.log("maxNumbers2:"+maxNumbers2)

    // 验证是否是数组(前提是toString()方法没有被重写过)
    function isArray(obj){
      return Object.prototype.toString.call(obj) === "[object Array]"
    }
    console.log(isArray(numbers))

    // 类(伪)数组使用数组方法
    var documents = Array.prototype.slice.call(document.getElementsByTagName("*"))
    console.log(documents)

    // 面试题
    // 定义一个 log 方法,让它可以代理 console.log 方法,常见的解决方法是:
    // function log(msg){
    //   console.log(msg)
    // }
    // log(1)

    // 当传入参数的个数是不确定
    // function log(){
    //   console.log.apply(console,arguments)
    // }
    // log(1,2)

    // 给每一个 log 消息添加一个"(app)"的前辍
    // function log(){
    //   var args = Array.prototype.slice.call(arguments)
    //   args.unshift("(app)")
    //   console.log.apply(console,args)
    // }
    // log("Hello World")

    // bind
    // var altwrite = document.write;
    // altwrite("hello")
    // altwrite()函数改变this的指向global或window对象,导致执行时提示非法调用异常,正确的方案就是使用bind()方法:

    var altwrite = document.write;
    // altwrite.bind(document)("Hello")
    altwrite.call(document,"Hello")

    console.log("---------绑定函数---------")
    // 绑定函数
    this.num = 9
    var mymodule = {
      num:81,
      getNum:function(){
        console.log(this.num)
      }
    } 
    mymodule.getNum()
    var getNum = mymodule.getNum;
    getNum()
    var bindGetNum = getNum.bind(mymodule)
    bindGetNum()

猜你喜欢

转载自blog.csdn.net/u012687612/article/details/111479809