JAVASCRIPT 基础教程
JAVASCRIPT & DOM
JAVASCRIPT & BOM
JAVASCRIPT 高级教程
JAVASCRIPT 示例
JAVASCRIPT 参考

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"
}

/* objB 没有 say() 方法,但它可以从 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"
}

/* objB 没有 say() 方法,但它可以从 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];

// 使用 Math.max 应用
var max = Math.max.apply(null, numbers);
alert(max); // 输出: 7

注意: call()apply() 的第一个参数是调用函数的对象。 使用 null 作为第一个参数就像调用函数而不为函数内部的 this 指针提供任何对象。

新的 ES6 spread operator 提供了一种更短的方法来从数组中获取最大值或最小值,而无需使用 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
Advertisements