함수를 호출하기위한 레지스트리 역할을 할 수있는 객체를 갖고 싶습니다.메소드와 객체를 호출하기위한 자바 스크립트
지금까지, 나는이 라인을 따라 뭔가 생각되었습니다
var registry = new Object();
registry.doStuff = function(){ /* */ };
거기에 더 나은 방법은? 객체 추가는 어떻습니까? 이상적으로, 나는 이것을 런타임에 추가 할 수 있기를 원합니다.
함수를 호출하기위한 레지스트리 역할을 할 수있는 객체를 갖고 싶습니다.메소드와 객체를 호출하기위한 자바 스크립트
지금까지, 나는이 라인을 따라 뭔가 생각되었습니다
var registry = new Object();
registry.doStuff = function(){ /* */ };
거기에 더 나은 방법은? 객체 추가는 어떻습니까? 이상적으로, 나는 이것을 런타임에 추가 할 수 있기를 원합니다.
방법이 라인을 따라 뭔가 (이것은 자바와 같은 다른 언어의 클래스 선언 같은 경우)에 대해 : 그런 다음 함수를 선언
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?.
어떤 프로토 타입에 대해 간단히 설명 할 수 있습니까? 왜 여기에 사용합니까? –
@JamesPoulson 편집 됨 – sushain97
상황에 따라 개체 자체 나 해당 프로토 타입에 함수를 추가 할 수 있습니다.
개체의 프로토 타입에 함수를 추가하면 새 개체를 만들 때마다 해당 함수를 다시 만들지 않아도됩니다. 그렇지 않으면 새 오브젝트마다 함수가 다시 작성됩니다. 그럼에도 불구하고 함수가 생성자의 로컬 변수에 액세스하도록하려는 경우이 방법이 유리할 수 있습니다.
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
나는이 코드를 확인 해요,하지만 IE는 문제가있다! var registry = new Object ({doStuff = func})를 사용하십시오. –
어떤 IE 버전을 사용하고 있습니까? –
IE를 전혀 사용하지 않지만 내 프로젝트 중 하나에서 IE 6 7 8과 동일한 솔루션을 가지고 있다고 생각합니다. –