Definir una función con una cadena prototipo

Supongamos que tengo un objeto X define como

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

¿Es posible construir un función f para que f instanceof X? Tenga en cuenta que también debo ser capaz de hacer f() sin un TypeError.


En Mozilla, puedo hacer exactamente lo que quiero con __proto__:

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

Sin embargo, eso es (1) no estándar y (2) obsoleto. página de MDN para __proto__ sugiere usar Object.getPrototypeOf en cambio, pero lo que realmente estoy buscando es un Object.setPrototypeOf (que no existe, aunque la idea se plantea en este informe de error).

Una aproximación barata a lo que quiero es

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

Desafortunadamente, esto no hace f instanceof X cierto (¡ni esperaría que lo fuera!).

preguntado el 12 de junio de 12 a las 20:06

Creo que lo que está buscando es lo que generalmente se llama "objetos invocables". Es posible que desee realizar una búsqueda rápida en StackOverflow para ese término si es lo que está buscando. No estoy seguro si vas a encontrar una solución tan simple como __proto__ ofertas. -

Voy a ir con "¿Por qué?" y "Probablemente no". en este caso. -

@RyanKinal: se muestra un caso de uso en el informe de error que vinculé. -

1 Respuestas

No, no es posible (de forma estándar). Cada posibilidad de crear un objeto invocable (es decir, una función) creará uno heredado de Function.prototype1; y no puedes cambiar el [[prototype]] de un objeto después2.

Ver también:

1: OK, ES6 nos permite Subclase Function. Pero eso no es tan útil como parece.
2: Desde ES6, puedes usar Object.setPrototypeOf.

contestado el 23 de mayo de 17 a las 11:05

¿Porqué querrías eso? Y aún puede extender Function.prototype. - Bergi

Si bien personalmente no tengo un caso de uso (solo tenía curiosidad por saber si JavaScript podría hacer eso), hay un caso de uso en el informe de error que vinculé en la pregunta. - Bola de nieve

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.