美文网首页
ES5中apply与call使用

ES5中apply与call使用

作者: jshan | 来源:发表于2018-11-13 10:48 被阅读0次

    apply vs call

    applycall 的功能一样,都是: 劫持另外一个对象的方法,继承另外一个对象的属性,区别在于使用时传参不同,具体如下:

    // apply使用
    FunctionName.apply(obj, args) 该方法接受两个参数
    obj: 这个对象将代替FunctionName类里this对象
    args: 这个是数组,它将作为参数传递给FunctionName,并且传递过去的参数不再是数组,而是参数列表
    
    // call使用
    FunctionName.call(obj, [param1 [, param2 [, param3]]])
    obj: 这个对象将代替FunctionName类里this对象
    params: 这个是一个参数列表,相当于 args = [param1 [, param2 [, param3]]]
    
    // 举个例子
    function Person(name, age) {
        this.name = name;
        this.age = age;
    }
    
    function Student(name, age, grade) {
        console.info('arguments:',  JSON.stringify(arguments)); 
        // arguments: {"0":"js","1":12,"2":100}
        Person.apply(this, arguments);
        this.grade = grade;
    }
    
    let student = new Student('js', 12, 100)
    console.info('student: ', JSON.stringify(student));
    // student:  {"name":"js","age":12,"grade":100}
    

    由于apply可以将一个数组解析为一个一个的参数,那么我们在很多地方,都可以方便的使用一些函数,例如求取最大值,最小值,数组拼接等等

    // 求最大值
    const a = [1, 2, 3];
    const max = Math.max.apply(null, a);  // 等价于 Math.max(1, 2, 3)
    
    // 求最小值
    const a = [1, 2, 3];
    const min = Math.min.apply(null, a);   //  等价于 Math.min(1, 2, 3)
    
    // 拼接数组
    const arr1 = ['a', 'b', 'c'];
    const arr2 = ['d', 'e'];
    const arr3 = Array.prototype.push.apply(arr1, arr2);  // 等价于 arr1.push('d', 'e')
    

    相关文章

      网友评论

          本文标题:ES5中apply与call使用

          本文链接:https://www.haomeiwen.com/subject/zhukfqtx.html