2011-01-06 3 views
1

내가 아래 생성자 함수에 injectMethod 호출의 수를 줄일 수있는 방법에 관심이 객체 새 변수를 선언 할 필요없이 원하는만큼의 URL 참조를 포함하는 생성자 함수에 객체를 추가 한 다음 메서드를 호출 할 수 있습니까?

+1

'this.injectMethod = function() {...'을 쓰는 대신,'InjectScriptsAndExecute()'의'prototype'에 그것을 추가함으로써 실제로 그 함수를 재사용해야합니다. 각 인스턴스에 대해 새 함수를 작성할 필요가 없습니다. 그래서 생성자 다음에 인스턴스를 생성하기 전에'InjectScriptsAndExecute.prototype.injectMethod = function() {...'을 실행 한 다음 생성자에서 해당 메소드를 제거하십시오. – user113716

+0

@ Patrick DW - 왜 그런가요? – RyanP13

+1

@ RyanP13 :보다 효율적입니다. 만약 당신이 new를 100 번 써서 생성자를 호출한다고 해보자. 각 인스턴스에 대해 별도의 (아직 동일한) 함수를 만들었습니다. 프로토 타입에 함수를 추가하면 인스턴스를 1 개 또는 1,000 개 만들 때 모두 공유하는 하나의 함수 만 존재하게됩니다. – user113716

답변

2

생성자가 객체 또는 배열을받을 수 있지만 여전히 하나의 인스턴스 만 생성 중입니다.

한 가지 방법은 생성자를 수정하여 일반 함수 (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

당신 수 -하지만 당신은 여기에 흥미로운 영역으로받을거야 :

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 당신이 어떤 주파수에이 일을하는 경우 같은 종속성 관리자가 . DojoYUI은 전체 프레임 워크를 찾는 경우 종속성 관리도 제공합니다.