Frage

Mit JavaScript können Funktionen als Objekte behandelt werden. Wenn Sie zunächst eine Variable als Funktion definieren, können Sie dieser Funktion anschließend Eigenschaften hinzufügen.Wie macht man das Gegenteil und fügt einem „Objekt“ eine Funktion hinzu?

Das funktioniert:

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

An dieser Stelle, foo() ruft die Funktion auf und foo.baz hat den Wert „qqqq“.

Wenn Sie jedoch zuerst den Teil der Eigenschaftszuweisung durchführen, wie weisen Sie der Variablen anschließend eine Funktion zu?

var bar = { baz: "qqqq" };

Was kann ich jetzt tun, um das zu arrangieren? bar.baz den Wert „qqqq“ haben Und bar() die Funktion aufrufen?

War es hilfreich?

Lösung

Es ist einfach, hier verwechselt werden, aber Sie können nicht (leicht oder klar oder soweit ich weiß) zu tun, was Sie wollen. Hoffentlich wird dies deutlich helfen, die Dinge auf.

Als erstes erbt jedes Objekt in Javascript aus dem Objekt-Objekt.

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

Zweitens Funktionen ARE Objekte in Javascript. Insbesondere sind sie ein Function-Objekt. Das Funktionsobjekt erbt von dem Object-Objekt. Kasse der Funktion Konstruktor

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

Wenn Sie eine Variable deklarieren ein „Objekt“ zu sein, Sie können nicht (leicht oder klar oder soweit ich weiß) wandeln es in ein Funktionsobjekt. Sie müßten ein neues Objekt vom Typ Funktion erklären (mit der Funktion Konstruktor einer Variable einer anonyme Funktion usw. zuweisen), und kopieren Sie alle Eigenschaften von Methoden aus dem alten Objekt.

Schließlich eine mögliche Frage erwarten, auch einmal etwas als Funktion deklariert ist, können Sie nicht (soweit ich weiß) ändern, um die functionBody / Quelle.

Andere Tipps

Es scheint keine Standardmethode dafür zu geben, aber diese funktioniert.

WARUM ist jedoch die Frage.

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" 

Es gibt einfach keinen anderen Weg, dies zu erreichen, das zu tun

x={}
x() 

WIRD einen „Typfehler“ zurückgeben.weil „x“ ein „Objekt“ ist und man es nicht ändern kann.Es ist ungefähr so ​​​​vernünftig wie der Versuch, es zu tun

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

es wird nicht funktionieren.1 ist eine ganze Zahl.Ganzzahlen haben keine Array-Methoden.Du schaffst es nicht.

Objekttypen sind Funktionen und ein Objekt selbst ist eine Funktion Instanziierung.

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

Anzeigen (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]
}

Insbesondere ein Funktionsobjekt beachten, function Function() { [native code] }, wird als Rekursion definiert (eine rekursive Definition mit sich selbst).

Beachten Sie auch, dass die Antwort 124402 # 124402 unvollständig bezüglich 1[50]=5. Dies bedeutet eine Eigenschaft zu einem Number-Objekt zuweisen und gültig ist Javascript. Beachten Sie,

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"))

Anzeige

a   fu  fu  bar 4   2   life    ghi

zu interpretieren und richtig nach Javascripts "Rules of Engagement" ausgeführt wird.

Natürlich gibt es immer ein Falten und manifestiert durch =. Ein Objekt ist oft „kurzgeschlossen“, um seinen Wert anstelle einer vollwertigen Einheit, wenn eine Variablen zugewiesen. Dies ist ein Problem mit Booleschen Objekten und Boolesche Werte.

Explicit Objektidentifikation löst dieses Problem.

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

„Überladen“ ist eine ganz legitime Ausübung Javascript und explizit mit Mechanismen wie prototyping unterstützt, obwohl Code-Verschleierung eine Gefahr sein kann.

Schlussbemerkung:

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

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

Verwenden Sie eine temporäre Variable:

var xxx = function()...

kopieren Sie dann alle Eigenschaften vom Originalobjekt:

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

endlich die neue Funktion mit den alten Eigenschaften der ursprünglichen Variablen zuweisen:

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

JavaScript ermöglicht Funktionen sein   behandelt als Objekte - Sie können eine hinzufügen   Eigenschaft auf eine Funktion. Wie geht's   umgekehrt, und eine Funktion, um einen Add   Objekt?

Sie scheinen ein wenig verwirrt zu sein. Funktionen, in JavaScript, ist Objekte. Und Variablen sind Variable . Sie würden nicht erwarten, zu arbeiten:

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

... also warum sollten Sie erwarten, dass eine Funktion, um Ihre Variablen zugewiesen irgendwie seinen vorherigen Wert erhalten würde? Vielleicht haben einige Anmerkungen werden die Dinge klären für Sie:

// 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: Beitrag im Stil geschrieben, wie ich das Problem gelöst. Ich bin nicht 100% sicher, dass es in den OP der Fall verwendbar ist.

fand ich diesen Beitrag, während nach einer Möglichkeit, Objekte auf dem Server und geliefert an den Client von JSON / AJAX erstellt zu konvertieren.

Was ich effektiv in der gleichen Situation wie die OP links, ein Objekt, das ich zu umwandeln in eine Funktion sein wollte, um die Lage sein, Instanzen davon auf dem Client zu erstellen.

Am Ende kam ich damit auf, die funktionieren (zumindest bisher):

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);
    }
}

Welche kann dann wie verwendet werden:

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

In meinem Fall wollte ich eigentlich Funktionen mit den daraus resultierenden Objektinstanzen verknüpft haben, und auch in den Parametern zum Zeitpunkt passieren kann, um es von der Instanziierung.

Also mein Code war:

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);
    }
}

Und hieß also:

// 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]);
}

Und dann können sie verwendet werden:

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

Ich glaube, du bist für diese suchen.

kann auch wie folgt geschrieben werden:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top