2011-01-06 9 views
1

ich in einer Art und Weise interessiert war, die Zahl der Anrufe an die injectMethod auf der folgenden Konstruktor Funktion zu reduzieren: einReduzierung Anzahl der Anrufe auf die Methoden eines JavaScript-Objekt

function InjectScriptsAndExecute(url) { 
this.url = url; 
this.injectMethod = function() { 
    var inject = $.ajax({ 
     url: this.url, 
     cache: true, 
     dataType: 'script' 
     }); 
    return inject;  
} 
} 
var pngFix = new InjectScriptsAndExecute("/Global/ICIS/Scripts/DD_belatedPNG_0.0.8a-min.js"); 
var pngList = new InjectScriptsAndExecute("/Global/ICIS/Scripts/DD_PNG_listing.js"); 
pngFix.injectMethod(); 
pngList.injectMethod(); 

Gibt es eine Weise, die ich passieren kann Objekt an die Konstruktorfunktion, die so viele URL-Referenzen enthält, wie ich möchte, ohne eine neue Variable deklarieren zu müssen und anschließend die Methode aufzurufen?

+1

Als eine Randnotiz, anstelle von this.injectMethod = function() {... ', sollten Sie diese Funktion wirklich wiederverwenden, indem Sie sie zum' Prototyp' von 'InjectScriptsAndExecute()' hinzufügen. Es muss keine neue Funktion für jede Instanz erstellt werden. Nach dem Konstruktor, aber bevor Sie Instanzen erstellen, führen Sie 'InjectScriptsAndExecute.prototype.injectMethod = function() {...' aus und entfernen Sie diese Methode aus dem Konstruktor. – user113716

+0

@ Patrick DW - warum ist das? – RyanP13

+1

@ RyanP13: Einfach effizienter. Sagen Sie, wenn Sie den Konstruktor 100 Mal mit 'new' aufrufen. Sie haben für jede Instanz eine separate (noch identische) Funktion erstellt. Wenn Sie die Funktion zum "Prototyp" hinzufügen, gibt es, unabhängig davon, ob Sie 1 oder 1.000 Instanzen erstellen, nur die eine Funktion, die alle gemeinsam nutzen. – user113716

Antwort

2

Sie könnten den Konstruktor ein Objekt oder Array erhalten, aber Sie erstellen immer noch nur eine Instanz.

Eine Möglichkeit wäre, den Konstruktor so zu ändern, dass Sie ihn als reguläre Funktion (ohne new) aufrufen und ihm ein Array der URLs übergeben. Dann wird es über das Array iterieren, einen rekursiven Aufruf, aber mit das Schlüsselwort new, und überschreiben jede URL mit der neuen Instanz.

Dann würde es das ursprüngliche Array zurückgeben.

function InjectScriptsAndExecute(url) { 
    if (Object.prototype.toString.call(url).indexOf('Array') != -1) { 
     for (var i = 0, len = url.length; i < len; i++) { 
      url[i] = new InjectScriptsAndExecute(url[i]); 
     } 
     return url; 
    } else { 
     this.url = url; 
     this.injectMethod = function() { 
      var inject = $.ajax({ 
       url: this.url, 
       cache: true, 
       dataType: 'script' 
      }); 
      return inject; 
     } 
    } 
} 
var arr = InjectScriptsAndExecute(["/Global/ICIS/Scripts/DD_belatedPNG_0.0.8a-min.js", 
         "/Global/ICIS/Scripts/DD_PNG_listing.js" 
         ]); 
var len = arr.length; 

while(len--) { 
    arr[len].injectMethod(); 
} 

Zur Sicherheit würden Sie wirklich wollen einige zusätzliche Kontrollen haben, um zu sehen, ob die Funktion als Konstruktor oder nicht aufgerufen wird. Und je nachdem, ob ein Array oder eine Zeichenfolge empfangen wurde, sollten Sie für jedes Verhalten ein geeignetes Verhalten haben.

1

Sie können - aber Sie werden hier in interessantes Gebiet erhalten:

function InjectScriptsAndExecute() { 
this.urls = Array.prototype.slice.call(arguments, 0); 
this.injectMethod = function() { 
    for (var i=0; i < this.urls.length; i++) { 
    $.ajax({ 
     url: this.urls[i], 
     cache: true, 
     async: false, // Otherwise you cannot depend on the parse order 
     dataType: 'script' 
     }); 
} 
} 

// You can then use it in this way: 
var all_scripts = 
new InjectScriptsAndExecute("/Global/ICIS/Scripts/DD_belatedPNG_0.0.8a-min.js", 
     "/Global/ICIS/Scripts/DD_PNG_listing.js"); 

all_scripts.injectMethod(); 

Was Sie wahrscheinlich wollen, ist ein Abhängigkeits Manager wie Require.js oder LAB.js, wenn Sie diese mit einem beliebigen Frequenz tun . Dojo und YUI bieten auch Abhängigkeitsverwaltung, wenn Sie nach einem vollständigen Framework suchen.

Verwandte Themen