JavaScript 借用方法
在本教程中,你将学习如何从 JavaScript 中借用现有对象的功能。
从对象借用方法
在 JavaScript 中,你可以从其他对象借用方法来构建一些功能,而无需继承其所有属性和方法。
JavaScript 为所有函数对象提供了两种方法, call()
和 apply()
,它们允许调用函数,就好像它是另一个对象的方法一样。这是一个例子:
var objA = {
name: "object A",
say: function(greet) {
alert(greet + ", " + this.name);
}
}
objA.say("Hi"); // Displays: Hi, object A
var objB = {
name: "object B"
}
/* The objA doesn't have say() method, but it can borrow it from objA */
objA.say.call(objB, "Hello"); // Displays: Hello, object B
call()
与 apply()
方法的区别
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"); // Displays: Hi, object A
var objB = {
name: "object B"
}
/* The objA doesn't have say() method, but it can borrow it from objA */
objA.say.apply(objB, ["Hello"]); // Displays: Hello, object B
使用内置方法
apply()
方法还允许你使用内置方法快速轻松地执行某些任务。一个这样的例子是使用 Math.max()
/ Math.min()
来找出数组中的最大值或最小值,否则需要在数组值上循环。
正如你在前面的章节中已经知道的那样,JavaScript 数组没有 max()
方法,但 Math 有,所以我们可以应用这个 Math.max()
方法,如下所示:
var numbers = [2, 5, 6, 4, 3, 7];
// Using Math.max apply
var max = Math.max.apply(null, numbers);
alert(max); // Outputs: 7
注意: call()
和 apply()
的第一个参数是在其上函数是被调用的对象。使用 null
作为第一个参数就像调用函数而不为函数内的 this
指针提供任何对象。
新的 ES6 扩展运算符提供了一种在不使用该 apply()
方法的情况下从数组中获取最大值或最小值的更短方法。这是一个例子:
var numbers = [2, 5, 6, 4, 3, 7];
// Using spread operator
var max = Math.max(...numbers);
alert(max); // Outputs: 7
但是,如果数组中包含太多元素(例如数万个) ,spread
(...
)和 apply()
将失败或返回错误的结果。在这种情况下,你可以使用 Array.reduce()
来查找数值数组中的最大值或最小值,方法是比较每个值,如下所示:
var numbers = [2, 5, 6, 4, 3, 7];
// Using reduce method
var max = numbers.reduce(function(a, b) {
return Math.max(a, b);
});
alert(max); // Outputs: 7