Veo muchos desarrolladores profesionales de javascript probando si un objeto es una función usando
Object.prototype.toString.call(fn) === "[object Function]"Usualmente estoy usando
fn instanceof Function === truealguien me puede iluminar. Gracias
instanceof solo busca la propiedad del constructor en la cadena de prototipos. Verel estándar :
@@hasInstance: un método que determina si un objeto constructor reconoce un objeto como una de las instancias del constructor. Llamado por la semántica del operador instanceof.
Lo que significa que puedes "engañarlo":
let Constructor = function(){}; Constructor.prototype = Function.prototype; let Not_A_Real_Function = function(){}; Not_A_Real_Function.prototype = new Constructor; let not_a_real_function = new Not_A_Real_Function; // instanceof console.log(not_a_real_function instanceof Function); // prints true // Object.prototype.toString console.log(Object.prototype.toString.call(not_a_real_function) === "[object Function]"); // prints false // typeof console.log(typeof not_a_real_function === "function"); // prints false Sin embargo, una desventaja de Object.prototype.toString es que potencialmente puede anularlo todo junto, para que devuelva lo que quiera.
let Object = { prototype: { toString(fn){ return "foo"; } } }; let fc = function(){}; console.log(Object.prototype.toString.call(fc) === "foo"); En aras de la exhaustividad:
Como señaló @Bergi ,
typeof fn == "function"es probablemente la forma más segura. (Ver el primer fragmento)