2012-04-06 9 views
0

Unten ist eine vereinfachte Version meiner App, der folgende Code funktioniert wie vorgesehen. Ich kann 4 Protokolle in meiner Konsole mit den Argumenten sehen, die ich an SayHello übergab.Shortcut zu einem Konstruktor Aufruf

var App = {}; 

(function(that){ 

    that.SayHello = function(){ 
     console.log(arguments); 
     return { 
      doSomething: function(){ 
       console.log('done'); 
      } 
     }; 
    }; 

    var obj = { 
     t: new that.SayHello('a', 1), 
     r: new that.SayHello('b', 2), 
     b: new that.SayHello('c', 3), 
     l: new that.SayHello('d', 4) 
    }; 

}(App)); 

Ausgabe: Ich versuche, eine "Abkürzung" zu new that.SayHello wie folgt zu erstellen:

var Greet = function(){ 
     return new that.SayHello; 
    }, 
    obj = { 
     t: Greet('a', 1), 
     r: Greet('b', 2), 
     b: Greet('c', 3), 
     l: Greet('d', 4) 
    }; 

Die Konsolenprotokolle 4 leere Arrays. Das bedeutet, dass die arguments nicht bestanden wurde.

Ich versuchte auch return new that.SayHello.apply(this, arguments); und return new that.SayHello.call(this, arguments);.

Wie kann ich ALLE Greet 's arguments zu that.SayHello übergeben?
Wissen, dass ich that.SayHello mit new that.SayHello initialisieren oder sonst meinen Code bricht.

ich für eine allgemeine Lösung für eine beliebige Anzahl von arguments suchen, ich will nicht das arguments eines nach dem anderen zu übergeben. Dieser Code ist auch verfügbar unter jsfiddle.

Antwort

1

So ähnlich?

var Greet = function(){ 
    var result = that.SayHello.prototype; 
    that.SayHello.apply(result, arguments); 
    return result; 
} 

Sie sollten wissen, dass applyargumentsresult zum Objekt gilt. Vordefinieren result als SayHello Prototyp wird Ihnen geben, was Sie wollen.

EDIT

Unfortunetly oberhalb der Code wird den Prototyp SayHello verändern. Dies ist offensichtlich unerwünschtes Verhalten. Um dies zu vermeiden, sollten wir das Prototyp-Objekt kopieren. Zum Beispiel den folgenden Code

function clone(obj) { 
    if (null == obj || "object" != typeof obj) return obj; 
    var copy = obj.constructor(); 
    for (var attr in obj) { 
     if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; 
    } 
    return copy; 
} 

var Greet = function(){ 
    var result = clone(that.SayHello.prototype); 
    that.SayHello.apply(result, arguments); 
    return result; 
} 

ich diese einfache Version von clone Funktion in this answer habe verwenden gefunden. Es gibt viele Probleme damit und Sie sollten andere Antworten überprüfen. Zum Beispiel könnte die Verwendung von jQuerys $.extend({},originalObject) eine gute Idee sein.

Beachten Sie, dass, wenn Sie nicht über Prototyp Verkettungs egal (obwohl Sie sollten) Sie immer etwas sehr einfach, wie dies tun:

var Greet = function(){ 
    var result = {}; 
    that.SayHello.apply(result, arguments); 
    return result; 
} 

Wenn Sie kümmern sich nicht um ältere Browser (ECMAScript 5) dann können Sie verwenden Object.create methode:

var Greet = function(){ 
    var result = Object.create(that.SayHello.prototype); 
    that.SayHello.apply(result, arguments); 
    return result; 
} 
+0

Genau so! Vielen Dank! – Pierre

+0

@Pierre Es gab einen Hauptfehler in meiner Antwort, ich habe es aktualisiert. – freakish

Verwandte Themen