2016-09-04 1 views
0

내가하고 싶은 것은 객체의 메소드 라이브러리를 생성하고 객체가 실제로 정의되거나 컴파일되기 전에 객체가 사용될 때까지 기다리는 자바 스크립트를로드하는 것이다. 실제로 완전히 정의되기 전에이 객체에 대한 참조를 작성하고 싶습니다. 객체의 메소드가 정의되기 전에이 객체에 대한 메소드를 처음 호출 할 때 (객체에 실제로 메소드가 없음을 의미) 객체를 정의한 다음 메소드를 호출하려고합니다. "sayHello()"가 아직 정의되지 않은 경우 "MyLibrary.sayHello()"와 같은 표준 구문을 사용하여이 작업을 수행 할 수 있습니까? 나는 그것이 같을 것이다 상상이는 의사 코드이다라이브 개체 생성 및 부분 분해 관리는 어떻게 javascript에서 작동합니까?

var independentVar = "noCommitments"; 
var MyLibrary = function(user_ini){ 
    //MyLibrary.init looks like 
    // (function(ini){ 
    //  var a = ini; 
    //  return function(){ 
    //   //Notice the method sayHello defines when called, 
    //   // and does not return a reference 
    //   return { 
    //    b:a,c:"c",sayHello:function(z){return "Hello"+a+z} 
    //   } 
    //  } 
    // })(user_ini); 
    var d1 = myRequire("MyLibrary.init"); 
    return { 
     **handleAll : function(){ this = d1(); this.("**calledMethod")} 
    } 
}; 

var greeting = MyLibrary.sayHello(); 

alert(greeting); 

. 정리에 메서드를 추가하면 해당 객체를 "{** handleAll : function() {/ noContext /}}"의 초기화되지 않은 상태로 반환 할 수 있습니다. 내 응용 프로그램/라이브러리에는 이런 식으로 스텁과 링크가 있으며 정의되지 않은 상태에서 즉시 사용할 수 있습니다. 모듈을 만들 때 유틸리티에 대한 참조 수를 줄이면 유용 할 수 있습니다. 게시물에 함수 메뉴가 있고 이러한 기능은 모든 게시물에 의해 공유됩니다 - 여기에 설명 된 것과 같은 메커니즘을 사용하면 "활성 게시물"/ "포커스가있는 게시물"만 유틸리티를 참조합니다. 모듈 활성화 및 비활성화 기능을 제공합니다. 특별한 부분은 모듈이 이미 예열되어 있고 아직 함수를 호출하지 않고도 함수를 호출 할 준비가되어 있습니다. 라이브 바인딩과 비슷하지만 전체 사용자 인터페이스가 이미 정확한 함수로 이미 정의 된 함수로 정의 될 수 있습니다 그들이 쓸모있을 때 그들이 가질 이름. 디폴트와 debounce에 대한 제어 메커니즘은이 모델에서 쉽게 발견 할 수 있습니다.

내 질문은 :이 유형의 스크립팅이 기본적으로 가능합니까? 아니면 TypeScript, CoffeeScript 또는 기타와 같은 컴파일 형식을 사용해야합니다. 싱글 톤 팩토리에 매개 변수로 호출하고 싶은 메서드를 전달하면 가능하다는 것을 이해합니다. 최종적으로 코드를 오염시키지 않으면 서 사용하지 않는 기능을 정상적으로 저하시킬 수있는 전체 응용 프로그램을 원합니다.

내가 오염으로 의미 :

var LibDef = (
function(){ 
    return { 
     callUndefined:function(methodName){ 
      var returnVal = {} 
     } 
    } 
})() 

var MySingltonLibrary = moduleSinglton.getLibrary("MyLibrary", Lib); 
var greeting = MySingltonLibrary.callUndefined("sayHello"); 
// 
// Please use your imagination to consider the complexity in the singlton 

답변

0

단일 참조를 그 기능과 구성원이 힙에 소비하는 모든 공간을 해제 객체를 해체하고 유지 관리 할 수있는 가장 좋은 방법을, 그것은을 허용합니다 자신을 다시하거나 다음과 같이됩니다 호출되는 함수를 다시 객체 - (매우 간단한 모델, 당신은 배열을 사용하고 점차적으로 내부에 중첩 된 객체를 해체하실 수 있습니다) : 추가 메모에서

var twentySecondObj(function(window,document){ 
    var base_obj = undefined; 
    var externalAPI = undefined; 
    setTimeout(function(){ 
     base_obj = undefined; 
    },20000); 
    return function(){ 
     base_obj = (function(base_obj){ 
      if(base_obj === undefined){ 
       return { 
        property1:"This is property1", 
        property2:"This is property2" 
       } 
      } 
     })(); 
     externalAPI = (function(){ 
      if(externalAPI === undefined){ 
       return { 
        property1:base_obj.property1, 
        property2:base_obj.property2 
       } 
      } 
     })(); 
     return externalAPI; 
    } 
})(window,document); 

console.log(twentySecondObj().property1); 

을, 당신 getters 및 setters를 사용하여 액세스를 관찰 할 수 있습니다. 내부적으로 위의 것과 같은 빌드 메소드를 참조하는 함수와 속성 모두의 외관을 표시 할 수 있습니다. 이렇게하면 객체의 정당한 멤버에 액세스하는 것처럼 보입니다. myObj.fooProperty = "foo"와 같은 객체에 새 속성을 설정하려고 시도 할 때 가로 채기 할 수있는 옵션은 생각할 수 없습니다. getter 및 setter를 사용하여 사용자 정의 객체에 해당 속성을 작성합니다. 설정할 필요가있는 커스텀 타입을 가지고 있다면, 그것을 설정하기위한 implimentation 세부 사항을 알거나, 프로퍼티 이름과 값을 전달하는 함수를 호출하거나, 위에 보이는 것과 유사한 메소드를 사용해야합니다.

약한 참조를 javascript : https://ponyfoo.com/articles/weakref 약한 참조를 추가하는 제안에 대한 링크가이 모양을 변경하지만이 질문에서 언급 한 모든 것을 다루지는 않습니다. 일부 유형의 딥 옵저버를 통해 속성을 추가 할 때 개체를 다시 매핑하면 새 속성 멤버가 설정 될 때 향상 될 수 있습니다. 이럴 경우 속성을 설정할 때 관찰자가 동시에 또는 집합이 완료되면 관찰자가 동시에 실행되어야합니다. 바로 다음 문장은 객체를 갱신하는 호출이어야합니다.앞으로 보게 될 자바 스크립트 내에서 "기본 처리기 기능"을 사용할 수있는 발전을 위해 여기에 게시 할 것입니다.

관련 문제