Définir une fonction avec une chaîne prototype

Supposons que j'ai un objet X défini comme

 var X = function () {}; X.prototype.doSomething = function () {}; X.prototype.doSomethingElse = function () {}; 

Est-il possible de construire une fonction f sorte que f instanceof X ? Notez que je dois également pouvoir faire f() sans TypeError .


Dans Mozilla, je peux faire exactement ce que je veux avec __proto__ :

 var f = function () {}; f.__proto__ = new X; 

Cependant, c'est (1) non standard et (2) obsolète. La page de MDN pour __proto__ suggère d'utiliser Object.getPrototypeOf place, mais ce que je recherche vraiment, c'est Object.setPrototypeOf (qui n'existe pas, bien que l'idée soit soulevée dans ce rapport de bogue ).

Une approximation peu coûteuse de ce que je veux est

 var f = function () {}; jQuery.extend(f, new X); 

Malheureusement, cela ne rend pas f instanceof X true (et je ne m'attends pas à ça!).

Non, ce n'est pas possible (de manière standard). Toute possibilité de créer un objet appelable (c.-à-d., Une fonction) créera un élément héritant de Function.prototype 1 ; Et vous ne pouvez pas changer le [[prototype]] d'un objet ensuite 2 .

Voir également:

  • Créer une fonction en javascript avec un prototype personnalisé
  • Pouvez-vous créer des fonctions avec des prototypes personnalisés en JavaScript?
  • Est-il possible de créer une fonction avec un autre prototype que Function.prototype?
  • Un objet JavaScript peut-il avoir une chaîne prototype, mais aussi être une fonction?
  • Chaîne prototype personnalisée pour une fonction
  • Chaîne prototype correcte pour la fonction (pour certains internes)

1: OK, ES6 nous permet de sous- classer la Function . Mais ce n'est pas aussi utile qu'il le semble.
2: Depuis ES6, vous pouvez utiliser Object.setPrototypeOf .