Prefacio
A través de los métodos de llamada (), aplicar () y bind (), podemos pedir prestados los métodos de otros objetos sin heredarlo de estos objetos.
Métodos de préstamo en JavaScript
En JavaScript, las funciones o métodos de otros objetos a veces se pueden reutilizar, no necesariamente definidos en el objeto en sí o en el prototipo. A través de los métodos de llamada (), aplicar () y atar (), podemos pedir prestados métodos de otros objetos sin heredarlos. Este es un método común utilizado por los desarrolladores profesionales de JavaScript.
Método prototipo
En JavaScript, a excepción de los tipos de datos primitivos inmutables, como la cadena, el número y el booleano, casi todos los datos son objetos. La matriz es un objeto adecuado para atravesar y convertir secuencias ordenadas. Su prototipo tiene métodos fáciles de usar, como Slice, Join, Push y Pop.
Un ejemplo común es que cuando tanto los objetos como las matrices son estructuras de datos del tipo de lista, los objetos pueden "pedir prestados" los métodos de las matrices. El método más común para pedir prestado es Array.prototype.slice .
function myFunc () {// Error, los argumentos son una matriz como objeto, no un argumento de matriz real.sort (); // "prestado" el método de matriz se corta de su prototipo, que toma un objeto como el objeto de matriz (clave: valor) // y devuelve una matriz real var args = array.prototype.slice.call (argumentos); // args ahora es una matriz real, por lo que puede usar el método sort () de la matriz args.sort (); } myFunc ('plátanos', 'cerezas', 'manzanas');Los métodos de préstamo funcionan porque los métodos de llamada y aplicación permiten funciones de llamadas en diferentes contextos, lo cual también es una buena manera de reutilizar las funciones existentes sin tener que heredar otros objetos. De hecho, las matrices definen muchos métodos comunes en prototipos, como unión y filtro:
// Tome una cadena "ABC" y produce "A | B | CarRay.Prototype.Join.call ('ABC', '|'); // Tome una cadena y elimina todos los no vowelsArray.prototype.filter.call ('ABCDefghijk', function (Val) {return ['a', 'e', 'i', 'o', 'u']. -1;}). Join (''); Se puede ver que no solo los objetos pueden pedir prestados métodos de matriz, sino también cadenas. Pero debido a que los métodos genéricos se definen en el prototipo, debe usar String.prototype o Array.prototype cada vez que desea tomar prestado un método. Escribir así es muy detallado y pronto se volverá molesto. Una forma más eficiente es usar literales para lograr el mismo propósito.
Uso de métodos de préstamo literal
Los literales son una estructura de sintaxis que sigue a las reglas de JavaScript, MDN lo explica así:
En JavaScript, el uso de literales puede representar valores. Son valores fijos, ya sea variables, o se dan literalmente en el script.
Los literales se pueden abreviar como prototipo:
[=
Esto no parece tan detallado, pero todavía es un poco feo tener que operar directamente en [] y "" para tomar prestado el método. Puede usar variables para guardar referencias a literales y métodos, lo que facilita la escritura:
var slice = [] .slice; slice.call (argumentos); var unir = [] .Join; unión.call ('ABC', '|'); var tOUPPERCASE = '' .ToUpperCase; toupperCase.call (['minúscula', 'palabras', 'en', 'a', 'oración']). Split (',');Con las referencias a los métodos de préstamos, podemos llamarlo fácilmente con Call (), que también puede reutilizar el código. Adheriendo al principio de reducir la redundancia, veamos si podemos pedir prestados métodos sin tener que escribir llamadas () o aplicar () cada vez que llamamos:
var slice = function.prototype.call.bind (array.prototype.slice); slice (argumentos); var unir = function.prototype.call.bind (array.prototype.join); unir ('ABC', '|'); var tOUPPERCASE = function.prototype.call.bind (string.prototype.touppercase); toUpperCase (['minúscula', 'palabras', 'en', 'a', 'oración']). Split (','); Como puede ver, ahora puede usar Function.prototype.call.bind para unir estáticamente el método "prestado" de diferentes prototipos. Pero, ¿cómo la oración var slice = Function.prototype.call.bind(Array.prototype.slice) realmente funciona?
Comprender function.prototype.call.bind
Function.prototype.call.bind puede parecer un poco complicado a primera vista, pero puede ser muy útil comprender cómo funciona.
Function.prototype.call es una referencia que "llama" una función y establecerá su valor "este" para usar en una función.
Tenga en cuenta que "Bind" devuelve una nueva función con su valor "este". Por lo tanto, el "esto" de la nueva función devuelta por .bind(Array.prototype.slice) es siempre la función array.prototype.slice.
Para resumir, la nueva función llama a la función "llamada", y su "esto" es la función "porta". Llamar a Slice () apuntará al método previamente calificado.
Métodos para personalizar objetos
La herencia es excelente, pero los desarrolladores generalmente la usan cuando quieren reutilizar algunas características comunes entre objetos o módulos. No es necesario usar la herencia solo para la reutilización del código, porque los métodos de endeudamiento simples pueden ser complicados en la mayoría de los casos.
Solo discutimos los métodos nativos de los préstamos antes, pero tomar prestado cualquier método está bien. Por ejemplo, el siguiente código puede calcular la puntuación del jugador del juego de puntos:
var scorecalculator = {getSum: function (resultados) {var stork = 0; for (var i = 0, len = results.length; i <len; i ++) {stork = score+resultados [i]; } puntaje de retorno; }, getScore: function () {return scorecalculator.getSum (this.results) / this.handicap; }}; var jugador1 = {resultados: [69, 50, 76], handicap: 8}; var jugador2 = {Resultados: [23, 4, 58], handicap: 5}; var stork = function.prototype.call.bind (scorecalculator.getscore); // puntaje: 24.375Console.log ('Score:' + Score (Player1)); // puntaje: 17console.log ('Score:' + Score (Player2));Aunque el ejemplo anterior es muy contundente, se puede ver que, al igual que los métodos nativos, los métodos definidos por el usuario se pueden tomar prestados fácilmente.
Resumir
Llamar, atar y aplicar puede cambiar la forma en que se llaman las funciones y a menudo se usan al tomar prestadas funciones. La mayoría de los desarrolladores están familiarizados con los métodos nativos de los préstamos, pero rara vez toman prestados métodos personalizados.
En los últimos años, la programación funcional de JavaScript se ha desarrollado bien. ¿Cómo usar function.prototype.call.bind para pedir prestado el método más conveniente? Se estima que tales temas serán cada vez más comunes.
Lo anterior es el resumen de los métodos de endeudamiento en JavaScript. Espero que sea útil para todos comprender los métodos de endeudamiento en JavaScript.