2013 및 2015 업데이트 (2011 년의 원래 답변은 아래 참조) :
이것은 ES2015 (일명 "ES6") 사양으로 변경되었습니다 . 이제 JavaScript에 프록시가 있습니다. 프록시를 사용하면 다른 객체에 대한 실제 프록시 인 객체를 만들 수 있습니다. 다음은 검색시 모든 대문자로 문자열 인 속성 값을 바꾸는 간단한 예입니다.
"use strict";
if (typeof Proxy == "undefined") {
throw new Error("This browser doesn't support Proxy");
}
let original = {
"foo": "bar"
};
let proxy = new Proxy(original, {
get(target, name, receiver) {
let rv = Reflect.get(target, name, receiver);
if (typeof rv === "string") {
rv = rv.toUpperCase();
}
return rv;
}
});
console.log(`original.foo = ${original.foo}`); // "original.foo = bar"
console.log(`proxy.foo = ${proxy.foo}`); // "proxy.foo = BAR"
재정의하지 않은 작업에는 기본 동작이 있습니다. 위에서 우리가 재정의하는 것은 모두 get
이지만 연결할 수있는 전체 작업 목록이 있습니다.
에서 get
핸들러 함수의 인수 목록 :
target
프록시되는 객체입니다 (이 original
경우에는).
name
(물론) 검색되는 속성의 이름으로, 일반적으로 문자열이지만 기호 일 수도 있습니다.
receiver
this
속성이 데이터 속성이 아닌 접근자인 경우 getter 함수에서와 같이 사용해야하는 객체입니다 . 일반적인 경우 프록시 또는 프록시에서 상속되는 것이지만 트랩이에 의해 트리거 될 수 있으므로 무엇이든 될 수 있습니다 Reflect.get
.
이를 통해 원하는 범용 게터 및 세터 기능을 사용하여 객체를 만들 수 있습니다.
"use strict";
if (typeof Proxy == "undefined") {
throw new Error("This browser doesn't support Proxy");
}
let obj = new Proxy({}, {
get(target, name, receiver) {
if (!Reflect.has(target, name)) {
console.log("Getting non-existent property '" + name + "'");
return undefined;
}
return Reflect.get(target, name, receiver);
},
set(target, name, value, receiver) {
if (!Reflect.has(target, name)) {
console.log(`Setting non-existent property '${name}', initial value: ${value}`);
}
return Reflect.set(target, name, value, receiver);
}
});
console.log(`[before] obj.foo = ${obj.foo}`);
obj.foo = "bar";
console.log(`[after] obj.foo = ${obj.foo}`);
위의 결과는 다음과 같습니다.
존재하지 않는 속성 'foo'가져 오기
[이전] obj.foo = 정의되지 않음
존재하지 않는 속성 'foo'설정, 초기 값 : bar
[후] obj.foo = 바
foo
아직 존재하지 않을 때 검색을 시도 할 때 그리고 존재하지 않을 때 다시 검색 할 때 "존재하지 않는"메시지를받는 방법에 주목 하십시오.
2011 년 답변 (2013 및 2015 업데이트는 위 참조) :
아니요, JavaScript에는 포괄적 인 속성 기능이 없습니다. 사용하는 접근 자 구문 은 사양의 11.1.5 절에서 다루며 와일드 카드 또는 이와 유사한 것을 제공하지 않습니다.
당신은 물론, 그것을 할 수있는 기능을 구현할 수 있습니다,하지만 난 당신이 아마 사용하지 않을 같은데요 f = obj.prop("foo");
보다는 f = obj.foo;
및 obj.prop("foo", value);
보다는 obj.foo = value;
(함수가 알 수없는 속성을 처리 할 필요가있을 것이다).
FWIW, getter 함수 (세터 로직을 신경 쓰지 않았습니다)는 다음과 같습니다.
MyObject.prototype.prop = function(propName) {
if (propName in this) {
// This object or its prototype already has this property,
// return the existing value.
return this[propName];
}
// ...Catch-all, deal with undefined property here...
};
그러나 다시 한 번 말하지만, 객체 사용 방식이 어떻게 바뀌는 지에 따라 실제로 그렇게하고 싶다고 상상할 수 없습니다.