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