Сокращение количества обращений к методам объекта JavaScript - PullRequest
1 голос
/ 06 января 2011

Меня заинтересовал способ уменьшить количество вызовов injectMethod в функции конструктора ниже:

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

Есть ли способ передать объект в функцию конструктора, содержащую столькоURL ссылки, как мне нравится, без необходимости объявлять новую переменную и впоследствии вызывать метод?

Ответы [ 2 ]

2 голосов
/ 06 января 2011

Вы могли бы заставить конструктор получить объект или массив, но вы все еще создаете только один экземпляр.

Одним из способов было бы изменить конструктор так, чтобы вы вызывали его как обычную функцию (без new), и передайте ему массив URL.Затем он будет выполнять итерацию по массиву, делая рекурсивный вызов, но с ключевым словом new, и перезаписывая каждый URL новым экземпляром.

Затем он возвращает исходный массив.

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

В целях безопасности вы действительно хотели бы иметь некоторые дополнительные проверки, чтобы увидеть, вызывается ли функция как конструктор или нет.И вы хотели бы иметь соответствующее поведение для каждого из них, в зависимости от того, получил ли он массив или строку.

1 голос
/ 06 января 2011

Вы можете - но вы попадете на интересную территорию здесь:

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

Что вам, вероятно, нужно, это менеджер зависимостей, такой как Require.js или LAB.js , если вы делаете это с какой-либо частотой. Dojo и YUI также обеспечивают управление зависимостями, если вы ищете полный каркас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...