函式借用是從物件中借用函式而不是重新定義它;但我為什么要這樣做。我們可以有一個通用函式,物件可以進一步使用它們。更準確地說;當我可以像代碼 #2 那樣編碼時,為什么要使用代碼 #1:
代碼#1
let car1 = {
speed: 80,
getSpeed: function () {
return this.speed;
},
};
let car2 = {
speed: 60,
};
console.log(car1.getSpeed());
console.log(car1.getSpeed.call(car2));
代碼#2
function getSpeed() {
return this.speed;
}
let car1 = {
speed: 80,
}
let car2 = {
speed: 60,
}
console.log(getSpeed.call(car1));
console.log(getSpeed.call(car2));
uj5u.com熱心網友回復:
當您已經為物件定義了一個方法(直接或通過原型鏈),并且您希望能夠將它與沒有定義該方法的類似物件一起使用時,將使用函式借用。
這就是您的代碼 #1 中的情況——該getSpeed()方法不是使用原型繼承或類,而是直接在car1. car2您可以從 借用,而不是復制 中的代碼car1。
您通常不會從頭開始以這種方式設計事物。要么使用代碼#2 中的普通函式,要么創建car1并car2繼承同一個原型。
函式借用通常只是針對糟糕的初始設計的一種解決方法。你在代碼中看到它
nodes = document.getElementsByClassName("foo");
result = [].prototype.map.call(nodes, someFunction);
因為NodeList原型沒有自己的map()功能。
uj5u.com熱心網友回復:
作為 Barmar 回答的附錄,您可能考慮的第三個選項是使用 aclass創建共享相同方法的物件實體。
class Car {
constructor(speed) {
this.speed = speed;
}
getSpeed() {
return this.speed;
}
}
console.log(new Car(80).getSpeed());
console.log(new Car(60).getSpeed());
uj5u.com熱心網友回復:
使用代碼 #1(函式借用)與代碼 #2 的好處是,它可以讓您跳過繼承。在您的例子您授予的訪問car1.getSpeed()到car2。
好處是:
- 跳過類繼承的需要
- 通過具有 1 個函式副本與浮動副本來減少錯誤。
它主要與本地方法一起使用,例如slice()fromArray.prototype
因此,如果您有類似陣列(但不完全是)的結構,則借用slice()fromArray.prototype可讓您訪問.map/.filter等。
實際例子:
function findS() {
return Array.prototype.slice.call(arguments).filter( arg => arg.includes('s'))
}
console.log(findS("Tesla", "Mitsubishi", "Ford"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/353764.html
標籤:javascript
