El préstamo de funciones es tomar prestada la función de un objeto en lugar de redefinirla; pero ¿por qué debería hacerlo? Podemos tener una función genérica y los objetos pueden usarla más. Ser más preciso; ¿Cuándo usaría el código n. ° 1 cuando puedo codificarlo como en el código n. ° 2:
código #1
let car1 = { speed: 80, getSpeed: function () { return this.speed; }, }; let car2 = { speed: 60, }; console.log(car1.getSpeed()); console.log(car1.getSpeed.call(car2));código #2
function getSpeed() { return this.speed; } let car1 = { speed: 80, } let car2 = { speed: 60, } console.log(getSpeed.call(car1)); console.log(getSpeed.call(car2));El préstamo de funciones se usa cuando ya tiene un método definido para un objeto (ya sea directamente o a través de la cadena de prototipos) y desea poder usarlo con un objeto similar que no tiene ese método definido.
Este es el caso de su código n.º 1: en lugar de usar herencia o clases prototípicas, el método getSpeed() se definió directamente en car1 . En lugar de duplicar el código en car2 , puede tomarlo prestado de car1 .
Normalmente no diseñarías cosas de esta manera desde cero. O usaría una función ordinaria como en el código #2, o haría que el car2 car1 del mismo prototipo.
El préstamo de funciones suele ser solo una solución para un diseño inicial deficiente. Lo ves en código como
nodes = document.getElementsByClassName("foo"); result = [].prototype.map.call(nodes, someFunction); porque el prototipo NodeList no tiene su propia función map() .
Como complemento a la respuesta de Barmar, la tercera opción que podría considerar es usar una class para crear instancias de objetos que comparten los mismos métodos.
class Car { constructor(speed) { this.speed = speed; } getSpeed() { return this.speed; } } console.log(new Car(80).getSpeed()); console.log(new Car(60).getSpeed());Los beneficios de usar el Código n. ° 1 (préstamo de funciones) frente al Código n. ° 2 es que le permite omitir la herencia. En su ejemplo, está otorgando acceso de car1.getSpeed() a car2 .
Los beneficios son:
Se usa principalmente con métodos nativos como slice() de Array.prototype
Entonces, si tiene estructuras similares a una matriz (pero no exactamente), tomar prestado slice() de Array.prototype le da acceso a .map / .filter , etc.
Ejemplo práctico:
function findS() { return Array.prototype.slice.call(arguments).filter( arg => arg.includes('s')) } console.log(findS("Tesla", "Mitsubishi", "Ford"))