2013-09-01 3 views
0

함수를 호출하기위한 레지스트리 역할을 할 수있는 객체를 갖고 싶습니다.메소드와 객체를 호출하기위한 자바 스크립트

지금까지, 나는이 라인을 따라 뭔가 생각되었습니다

var registry = new Object(); 

registry.doStuff = function(){ /* */ }; 

거기에 더 나은 방법은? 객체 추가는 어떻습니까? 이상적으로, 나는 이것을 런타임에 추가 할 수 있기를 원합니다.

+0

나는이 코드를 확인 해요,하지만 IE는 문제가있다! var registry = new Object ({doStuff = func})를 사용하십시오. –

+0

어떤 IE 버전을 사용하고 있습니까? –

+0

IE를 전혀 사용하지 않지만 내 프로젝트 중 하나에서 IE 6 7 8과 동일한 솔루션을 가지고 있다고 생각합니다. –

답변

3

방법이 라인을 따라 뭔가 (이것은 자바와 같은 다른 언어의 클래스 선언 같은 경우)에 대해 : 그런 다음 함수를 선언

var Registry = function (instanceVariable1) { 
    //Initialize any instance variables here (e.g. the registry data) 
    this.instanceVariable1 = instanceVariable1; 
}; 

을 :

Registry.prototype.doStuff = function() { 
    //do stuff here 
}; 

지금처럼 전화 :

var registry = new Registry(...); //pass in parameters here to initialize the Registry object with data 
registry.doStuff(); 

간략한 설명 : 모두 Javasc ript 개체는 prototype이고 obj['propertyName']을 통해 속성에 액세스하려고하면 해당 속성이없는 경우 prototype이 대신 선택됩니다. 프로토 타입을 사용하면 매번 함수를 다시 선언 할 필요없이 Registry 객체의 새 인스턴스를 만들 수 있습니다. 더 자세한 정보 : How does JavaScript .prototype work?.

+0

어떤 프로토 타입에 대해 간단히 설명 할 수 있습니까? 왜 여기에 사용합니까? –

+1

@JamesPoulson 편집 됨 – sushain97

1

상황에 따라 개체 자체 나 해당 프로토 타입에 함수를 추가 할 수 있습니다.

개체의 프로토 타입에 함수를 추가하면 새 개체를 만들 때마다 해당 함수를 다시 만들지 않아도됩니다. 그렇지 않으면 새 오브젝트마다 함수가 다시 작성됩니다. 그럼에도 불구하고 함수가 생성자의 로컬 변수에 액세스하도록하려는 경우이 방법이 유리할 수 있습니다.

1

sashain97의 답변을 확장하십시오.

다음은 프로토 타입 방법을 사용하여 만든 기능적인 예입니다.

 var Registry = function() { 
      this.settings = {}; 
     }; 
     Registry.prototype.setValue = function(object, path, value) { 
      var a = path.split('.'); 
      var o = object; 
      for (var i = 0; i < a.length - 1; i++) { 
       var n = a[i]; 
       if (n in o) { 
        o = o[n]; 
       } else { 
        o[n] = {}; 
        o = o[n]; 
       } 
      } 
      o[a[a.length - 1]] = value; 
     } 

     Registry.prototype.getValue = function(object, path) { 
      var o = object; 
      path = path.replace(/\[(\w+)\]/g, '.$1'); 
      path = path.replace(/^\./, ''); 
      var a = path.split('.'); 
      while (a.length) { 
       var n = a.shift(); 
       if (n in o) { 
        o = o[n]; 
       } else { 
        return; 
       } 
      } 
      return o; 
     } 

     Registry.prototype.set = function(path, value) { 
      return this.setValue(this.settings, path, value); 
     }; 

     Registry.prototype.get = function(path) { 
      return this.getValue(this.settings, path); 
     }; 

몇 가지 예 :

세트 변수 :

var registry = new Registry(); 

    registry.set('key1.var1', 'value'); 
    alert(registry.get('key1.var1')); 
    //alerts: value 

설정 방법 :

registry.set('key1.f1', function(message, suffix){alert(message + suffix);}); 
    registry.get('key1.f1')('hello', ' world'); 
    //alerts: hello world 
관련 문제