Pregunta

JavaScript permite que las funciones a ser tratados como objetos, si la primera vez que se define una variable como una función, que posteriormente se pueden añadir propiedades a esa función.¿Cómo se puede hacer a la inversa, y agregar una función a un "objeto"?

Esto funciona:

var foo = function() { return 1; };
foo.baz = "qqqq";

En este punto, foo() llama a la función, y foo.baz tiene el valor "qqqq".

Sin embargo, si la asignación de propiedad de la parte primera, ¿cómo, posteriormente, asignar una función a la variable?

var bar = { baz: "qqqq" };

¿Qué puedo hacer ahora para organizar bar.baz tener el valor "qqqq" y bar() para llamar a la función?

¿Fue útil?

Solución

Es fácil confundirse aquí, pero usted no puede (fácilmente o claramente o que yo sepa) a hacer lo que desea.Esperemos que esto ayude a aclarar las cosas.

En primer lugar, cada objeto en Javascript hereda del Objeto.

//these do the same thing
var foo = new Object();
var bar = {};

Segundo, las funciones de SON los objetos en Javascript.Específicamente, son un objeto de Función.El objeto de la Función hereda del Objeto.Comprobación de los La función de constructor

var foo = new Function();
var bar = function(){};
function baz(){};

Una vez que se declara una variable para ser un "Objeto" no se puede (fácilmente o claramente o que yo sepa) convertirlo en un objeto de Función.Tendría que declarar un nuevo Objeto de tipo Función (con la función de constructor, la asignación de una variable a una función anónima etc.), y copiar las propiedades de los métodos de su objeto antiguo.

Finalmente, anticipando una posible pregunta, incluso una vez que algo está declarada como una función, no se puede (que yo sepa) cambiar el functionBody de la fuente.

Otros consejos

No parece ser una forma estándar de hacerlo, pero esto funciona.

Por QUÉ sin embargo, es la pregunta.

function functionize( obj , func )
{ 
   out = func; 
   for( i in obj ){ out[i] = obj[i]; } ; 
   return out; 
}

x = { a: 1, b: 2 }; 
x = functionize( x , function(){ return "hello world"; } );
x()   ==> "hello world" 

Simplemente no hay otra manera de lograr esto, haciendo

x={}
x() 

Devolverá un "error de tipo".porque "x" es un "objeto" y no se puede cambiar.su tan sensible como tratando de hacer

 x = 1
 x[50] = 5
 print x[50] 

no va a funcionar.1 es un entero.los números enteros no tienen matriz métodos.no se puede hacer.

Los tipos de objetos son las funciones y un objeto en sí mismo es una función de creación de instancias.

  javascript:alert([Array, Boolean, Date, Function,
                       Number, Object, RegExp, String].join('\n\n'))

muestra (en FireFox):

function Array() {
    [native code]
}

function Boolean() {
    [native code]
}

function Date() {
    [native code]
}

function Function() {
    [native code]
}

function Number() {
    [native code]
}

function Object() {
    [native code]
}

function RegExp() {
    [native code]
}

function String() {
    [native code]
}

En particular, la nota de un objeto de Función, function Function() { [native code] }, se define como una relación de recurrencia (una definición recursiva usando la misma).

También, tenga en cuenta que el respuesta 124402#124402 es incompleta en relación con 1[50]=5.Esto NO asignar una propiedad para un Número de objetos y Javascript válida.Observar,

javascript:
     alert([  [].prop="a",   true.sna="fu",   (new Date()).tar="fu",
                     function(){}.fu="bar",   123[40]=4,   {}.forty=2,
                         /(?:)/.forty2="life",   "abc".def="ghi"  ].join("\t"))

muestra

a   fu  fu  bar 4   2   life    ghi

interpretar y ejecutar correctamente de acuerdo a Javascript "Reglas de Compromiso".

Por supuesto, siempre hay una arruga y se manifiestan por =.Un objeto es a menudo "corto-circuito" a su valor en lugar de un pleno de la entidad cuando se asigna a una variable.Este es un problema con el Booleano objetos y valores booleanos.

Explícita la identificación de objetos resuelve este problema.

javascript: x=new Number(1);  x[50]=5;  alert(x[50]);

"Sobrecarga" es bastante legítimo Javascript ejercicio y explícitamente de acuerdo con mecanismos como prototyping a pesar de que la ofuscación de código puede ser un peligro.

Nota Final:

javascript: alert(  123 . x = "not"  );

javascript: alert( (123). x = "Yes!" );  /* ()'s elevate to full object status */

Usar una variable temporal:

var xxx = function()...

a continuación copiar todas las propiedades del objeto original:

for (var p in bar) { xxx[p] = bar[p]; }

finalmente reasignar la nueva función con las antiguas propiedades de la variable original:

bar = xxx;
var A = function(foo) {                                                                                                      
  var B = function() {                                                                                                       
    return A.prototype.constructor.apply(B, arguments);
  };
  B.prototype = A.prototype;                                                                                                 
  return B;                                                                                                                  
}; 

JavaScript permite que las funciones de tratadas como objetos--usted puede agregar un propiedad a una función.¿Cómo se puede hacer a la inversa, y agregar una función a una objeto?

Usted parece ser un poco confundido.Funciones en JavaScript, son objetos.Y variables son variable.Usted no esperaría que esto funcione:

var three = 3;
three = 4;
assert(three === 3);

...entonces, ¿por qué esperar que la asignación de una función a la variable de alguna manera de preservar su valor anterior?Tal vez algunas anotaciones a aclarar las cosas para usted:

// assigns an anonymous function to the variable "foo"
var foo = function() { return 1; }; 
// assigns a string to the property "baz" on the object 
// referenced by "foo" (which, in this case, happens to be a function)
foo.baz = "qqqq";

NB:Post escrito en el estilo de cómo he resuelto el problema.No estoy 100% seguro de que es utilizable en la OP del caso.

He encontrado este post, mientras busca una manera de convertir los objetos creados en el servidor y se entregan al cliente por JSON / ajax.

Lo que, efectivamente, me dejó en la misma situación que el OP, un objeto que me quería convertir en una función de fin de ser capaz de crear instancias de ella en el cliente.

En el final se me ocurrió esto, que el 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 pueden ser utilizados como:

var data = { _type: "Example", foo: "bar" };
parentObject.createFunc(data);
var instance = new parentObject.Example();

En mi caso, yo en realidad quería tener funciones asociadas con el objeto resultante de los casos, y también ser capaz de pasar parámetros a la hora de crear instancias de ella.

Así que mi código:

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, a continuación, que pueden ser utilizados:

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
var bar = { 
    baz: "qqqq",
    runFunc: function() {
        return 1;
    }
};

alert(bar.baz); // should produce qqqq
alert(bar.runFunc()); // should produce 1

Creo que usted está buscando para este.

también puede ser escrita así:

function Bar() {
    this.baz = "qqqq";
    this.runFunc = function() {
        return 1;
    }
}

nBar = new Bar(); 

alert(nBar.baz); // should produce qqqq
alert(nBar.runFunc()); // should produce 1
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top