utilizo la siguiente función para crear instancias de funciones en JavaScript de una serie de argumentos:funciones Instantiate JavaScript con prototipos personalizados
var instantiate = function (instantiate) {
return function (constructor, args, prototype) {
"use strict";
if (prototype) {
var proto = constructor.prototype;
constructor.prototype = prototype;
}
var instance = instantiate(constructor, args);
if (proto) constructor.prototype = proto;
return instance;
};
}(Function.prototype.apply.bind(function() {
var args = Array.prototype.slice.call(arguments);
var constructor = Function.prototype.bind.apply(this, [null].concat(args));
return new constructor;
}));
Uso de la función de arriba se puede crear instancias de la siguiente manera (ver la fiddle):
var f = instantiate(F, [], G.prototype);
alert(f instanceof F); // false
alert(f instanceof G); // true
f.alert(); // F
function F() {
this.alert = function() {
alert("F");
};
}
function G() {
this.alert = function() {
alert("G");
};
}
El código anterior funciona para los constructores construida por el usuario como F
. Sin embargo, no funciona para constructores nativos como Array
por razones obvias de seguridad. Siempre puedes crear una matriz y luego cambiar su propiedad __proto__
pero estoy usando este código en Rhino para que no funcione allí. ¿Hay alguna otra forma de lograr el mismo resultado en JavaScript?
¿Cómo utilizaría 'Object.create' para eliminar la complejidad de mi código? Le agradecería si pudiera escribir una demostración. –
He agregado un enlace de ejemplo a mi respuesta. Tenga en cuenta que no funciona en la versión de rinoceronte de Ideone (pero funciona bien con la mía, 1.7r3). –
Su método funciona para la mayoría de los constructores. Sin embargo, causa [problemas] (http://jsfiddle.net/MMp5u/2/) cuando se usa una función de fábrica como constructor (por ejemplo, 'Array'). El uso de 'Object.create (Array.prototype)' crea un objeto que es un 'instanceof' del constructor' Array'. Sin embargo, no es en realidad una matriz. Mi función puede parecer un poco más compleja, pero evita [evita] (http://jsfiddle.net/MMp5u/1/) los problemas que presenta su función. –