JavaScript面向对象 - apply的应用

this的动态切换,固然为JavaScript创造了巨大的灵活性,但也使得编程变得困难和模糊。有时,需要把this固定下来,避免出现意想不到的情况。JavaScript提供了callapplybind这三个方法,来切换/固定this的指向。

绑定this的方法:

Function.prototype.apply()

apply方法的作用与call方法类似,也是改变this指向,然后再调用该函数

唯一的区别就是,它接收一个数组作为函数执行时的参数

func.apply(thisValue, [arg1, arg2, ...])

apply方法的第一个参数也是this所要指向的那个对象,如果设为nullundefined,则等同于指定全局对象

第二个参数则是一个数组,该数组的所有成员依次作为参数,传入原函数

原函数的参数,在call方法中必须一个个添加,但是在apply方法中,必须以数组形式添加

function f(x, y) {
    console.log(x + y);
}

f.call(null, 1, 1);        // 2
f.apply(null, [1, 1]);    // 2

f函数本来接受两个参数,使用apply方法以后,就变成可以接受一个数组作为参数

利用这一点,可以做一些有趣的应用

  • 找出数组最大元素

JavaScript 不提供找出数组最大元素的函数

结合使用apply方法和Math.max方法,就可以返回数组的最大元素

var a = [10, 2, 4, 15, 9];

Math.max.apply(null, a);        // 15
  • 将数组的空元素变为 undefined

通过apply方法,利用 Array构造函数将数组的空元素变成undefined

Array.apply(null, ['a', , 'b']);        // ['a', undefined, 'b']

空元素与undefined的差别在于,数组的forEach方法会跳过空元素,但是不会跳过undefined

因此,遍历内部元素的时候,会得到不同的结果

var a = ['a', , 'b'];

function print(i) {
    console.log(i);
}

a.forEach(print);
// a
// b

Array.apply(null, a).forEach(print);
// a
// undefined
// b
  • 转换类似数组的对象

利用数组对象的slice方法,可以将一个类似数组的对象(比如arguments对象)转为真正的数组

Array.prototype.slice.apply({0: 1, length: 1}) // [1]

Array.prototype.slice.apply({0: 1}) // []

Array.prototype.slice.apply({0: 1, length: 2}) // [1, undefined]

Array.prototype.slice.apply({length: 1}) // [undefined]

apply方法的参数都是对象,但是返回结果都是数组,这就起到了将对象转成数组的目的

从代码可以看到,这个方法起作用的前提是,被处理的对象必须有length属性,以及相对应的数字键

  • 绑定回调函数的对象
var o = new Object();

o.f = function () {
    console.log(this === o);
};

var f = function () {
    o.f.apply(o);
};

// jQuery
$('#button').on('click', f);

由于apply方法不仅绑定函数执行时所在的对象,还会立即执行函数,因此不得不把绑定语句写在一个函数体内

相关文章

感觉本篇文章不错,对你有收获?

¥我要小额赞助,鼓励作者写出更好的教程
80 160 120

作者:

  • 出处: https://www.mi360.cn/articles/81
  • 本文版权归作者,欢迎转载,但未经作者同意必须保留 此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

评论区

最新评论

扫码关注