上一章JavaScript教程请查看:JS事件传播机制
在本教程中,你将学习如何在JavaScript中借用现有对象的功能。
从对象中借用方法在JavaScript中,可以从其他对象借用方法来构建某些功能,而不必继承它们的所有属性和方法。
JavaScript为所有函数对象提供了两种方法,call()和apply(),它们允许调用一个函数,就像调用另一个对象的方法一样。这里有一个例子:
var objA = {
name: "object A",
say: function(greet) {
alert(greet + ", " + this.name);
}
}objA.say("Hi");
// 显示: Hi, object Avar objB = {
name: "object B"
}/* objA没有say()方法,但是它可以从objA借用 */
objA.say.call(objB, "Hello");
// 显示: Hello, object B
call()和apply()方法的区别【JS借用调用方法 – JavaScript高级教程】apply()方法的语法与call()几乎相同,唯一的区别是,call()方法接受一个参数列表,比如call(thisObj, arg1, arg2,…),而apply()方法只接受一个参数数组,比如apply(thisObj, [argsArray])。
注意方括号([]),它表示一个数组,在下面的例子的最后一行:
var objA = {
name: "object A",
say: function(greet) {
alert(greet + ", " + this.name);
}
}objA.say("Hi");
// 显示: Hi, object Avar objB = {
name: "object B"
}/* objA没有say()方法,但是它可以从objA借用 */
objA.say.apply(objB, ["Hello"]);
// 显示: Hello, object B
使用内置的方法apply()方法还允许你使用内置的方法来快速、轻松地执行某些任务。其中一个例子是使用Math.max()/Math.min()来找出数组中的最大值或最小值,否则就需要遍历数组值。
正如你在前面几章中已经知道的,JavaScript数组没有max()方法,但是Math有,所以我们可以应用Math.max()方法,如下所示:
var numbers = [2, 5, 6, 4, 3, 7];
// 使用Math.max apply
var max = Math.max.apply(null, numbers);
alert(max);
// : 7
注意: call()和apply()的第一个参数是要调用函数的对象,使用null作为第一个参数就像调用函数而不为函数内部的this指针提供任何对象一样。
新的ES6扩展操作符提供了一种更短的方法来获得数组的最大值或最小值,而无需使用apply()方法。这里有一个例子:
var numbers = [2, 5, 6, 4, 3, 7];
// 使用扩散操作符
var max = Math.max(...numbers);
alert(max);
// : 7
但是,如果数组中元素太多(例如,成千上万),那么spread(…)和apply()都将失败或返回错误的结果。在这种情况下,你可以使用array .reduce()查找数值数组中的最大值或最小值,方法是比较每个值,如下所示:
var numbers = [2, 5, 6, 4, 3, 7];
// 使用reduce方法
var max = numbers.reduce(function(a, b) {
return Math.max(a, b);
});
alert(max);
// : 7
推荐阅读
- JS函数提升和变量提升 – JavaScript高级教程
- JS事件传播机制 – JavaScript高级教程
- JS事件监听器 – JavaScript高级教程
- JS类型转换 – JavaScript高级教程
- JS数学操作 – JavaScript高级教程
- JS日期和时间 – JavaScript高级教程
- JS定时器timer – JavaScript教程
- JS创建对话框 – JavaScript教程
- JS窗口导航器navigator – JavaScript教程