NB: Mensaje escrito en el estilo de cómo he resuelto el problema. No estoy 100% seguro de que sea utilizable en el caso del OP.
Encontré esta publicación mientras buscaba una forma de convertir objetos creados en el servidor y entregados al cliente por JSON/ajax.
Lo que efectivamente me dejó en la misma situación que el OP, un objeto que quería convertir en una función para poder crear instancias de él en el cliente.
Al final se me ocurrió esto, que está trabajando (al menos hasta ahora):
var parentObj = {}
parentObj.createFunc = function (model)
{
// allow it to be instantiated
parentObj[model._type] = function()
{
return (function (model)
{
// jQuery used to clone the model
var that = $.extend(true, null, model);
return that;
})(model);
}
}
que luego puede ser utilizado como:
var data = { _type: "Example", foo: "bar" };
parentObject.createFunc(data);
var instance = new parentObject.Example();
En mi caso, en realidad quería tener funciones asociadas con las instancias de objetos resultantes, y también poder pasar parámetros en el momento de instanciarlo.
Así que mi código era:
var parentObj = {};
// base model contains client only stuff
parentObj.baseModel =
{
parameter1: null,
parameter2: null,
parameterN: null,
func1: function()
{
return this.parameter2;
},
func2: function (inParams)
{
return this._variable2;
}
}
// create a troop type
parentObj.createModel = function (data)
{
var model = $.extend({}, parentObj.baseModel, data);
// allow it to be instantiated
parentObj[model._type] = function(parameter1, parameter2, parameterN)
{
return (function (model)
{
var that = $.extend(true, null, model);
that.parameter1 = parameter1;
that.parameter2 = parameter2;
that.parameterN = parameterN;
return that;
})(model);
}
}
y fue llamado así:
// models received from an AJAX call
var models = [
{ _type="Foo", _variable1: "FooVal", _variable2: "FooVal" },
{ _type="Bar", _variable1: "BarVal", _variable2: "BarVal" },
{ _type="FooBar", _variable1: "FooBarVal", _variable2: "FooBarVal" }
];
for(var i = 0; i < models.length; i++)
{
parentObj.createFunc(models[i]);
}
Y luego se puede utilizar:
var test1 = new parentObj.Foo(1,2,3);
var test2 = new parentObj.Bar("a","b","c");
var test3 = new parentObj.FooBar("x","y","z");
// test1.parameter1 == 1
// test1._variable1 == "FooVal"
// test1.func1() == 2
// test2.parameter2 == "a"
// test2._variable2 == "BarVal"
// test2.func2() == "BarVal"
// etc
No entiendo la necesidad de hacer esta. ¿Puedes dar un ejemplo concreto de lo que estás tratando de lograr? – Geoff
No puedo pensar en un uso para la segunda forma en este momento. El primero es algo útil para variables estáticas (aunque los cierres también lo harán). Principalmente estoy preguntando porque no puedo pensar en una forma de lograrlo sin copiar las propiedades, lo cual es desafortunado ya que son formas paralelas. – mjs
Parece que esperas que porque puedes asignar un método a un objeto Javascript, también puedes asignar una sobrecarga al operador. No sé Javascript así que no sé la respuesta, pero buena suerte ... –