JavaScriptμμ Proxy κ°μ²΄λ κΈ°λ³Έ λμμ μ¬μ©μ μ μλ‘ λ³κ²½ν μ μλλ‘ ν΄μ€λλ€.
μ΄λ₯Ό ν΅ν΄ κ°μ²΄μ λν νλ‘μλ₯Ό μμ±νκ³ , κ°μ²΄μ μ κ·Όνκ±°λ κ°μ μ€μ ν λ μ¬μ©μ μ μ λ‘μ§μ μ μ©ν μ μμ΅λλ€.
μ΄ ν¬μ€νΈμμλ κ°μ²΄μ λν Proxy μμ± λ°©λ²κ³Ό μ΄λ₯Ό ν΅ν κ°μ²΄ μ μ΄μ μ₯μ μ μ΄ν΄λ³΄κ² μ΅λλ€.
Proxy κ°μ²΄λ₯Ό μμ±νκΈ° μν΄μλ new Proxy(target, handler)
λ₯Ό μ¬μ©νμ¬ λμ κ°μ²΄μ νΈλ€λ¬ κ°μ²΄λ₯Ό μΈμλ‘ μ λ¬ν©λλ€.
νΈλ€λ¬ κ°μ²΄λ λ€μν νΈλ©(trap) λ©μλλ₯Ό μ μνμ¬ λμ κ°μ²΄μ λν λμμ μ¬μ©μ μ μλ‘ λ³κ²½ν μ μμ΅λλ€.
λ€μ μμμμλ κ°λ¨ν νλ‘μλ₯Ό μμ±νμ¬ κ°μ²΄μ κ°μ κ°μ Έμ€λ(get) λ° μ€μ νλ(set) λμμ μ¬μ©μ μ μλ‘ λ³κ²½ν΄ λ³΄κ² μ΅λλ€.
const target = {
name: "John Doe"
};
const handler = {
get: function(obj, prop) {
console.log(`Getting property '${prop}'`);
return obj[prop];
},
set: function(obj, prop, value) {
console.log(`Setting property '${prop}' with value '${value}'`);
obj[prop] = value;
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.name); // μΆλ ₯: Getting property 'name'
// μΆλ ₯: John Doe
proxy.name = "Jane Doe"; // μΆλ ₯: Setting property 'name' with value 'Jane Doe'
μ μμμμλ κ°μ²΄μ κ°μ κ°μ Έμ€λ(get) λ° μ€μ νλ(set) λμμ μ¬μ©μ μ μνλ λ°©λ²μ μ΄ν΄λ³΄μμ΅λλ€.
μ΄λ₯Ό νμ©νμ¬ κ°μ²΄μ λμμ μνλ λλ‘ μμ νκ±°λ, κ°μ²΄μ νλ‘νΌν°μ λν μ ν¨μ± κ²μ¬λ₯Ό μνν μ μμ΅λλ€.
λ€μ μμμμλ κ°μ²΄μ λμ΄ νλ‘νΌν° κ°μ κ°μ Έμ¬ λ μλμΌλ‘ "μ΄"μ΄λΌλ λ¬Έμμ΄μ μΆκ°νμ¬ λ°ννλλ‘ μμ ν΄ λ³΄κ² μ΅λλ€.
const target = {
name: "John Doe",
age: 30
};
const handler = {
get: function(obj, prop) {
if (prop === "age") {
return obj[prop] + "μ΄";
} else {
return obj[prop];
}
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.age); // μΆλ ₯: 30μ΄
Proxy κ°μ²΄λ₯Ό μ¬μ©νλ©΄ κ°μ²΄μ νλ‘νΌν° κ°μ λν μ ν¨μ± κ²μ¬λ₯Ό μνν μ μμ΅λλ€.
μ΄λ₯Ό ν΅ν΄ κ°μ²΄μ μ μ₯λλ κ°μ μ ν©μ±μ 보μ₯νκ³ , λ²κ·Έ λ°μ κ°λ₯μ±μ μ€μΌ μ μμ΅λλ€.
λ€μ μμμμλ κ°μ²΄μ λμ΄ νλ‘νΌν° κ°μ΄ 0 μ΄μμΈμ§ νμΈνλ μ ν¨μ± κ²μ¬λ₯Ό μΆκ°ν΄ λ³΄κ² μ΅λλ€.
const target = {};
const handler = {
set: function(obj, prop, value) {
if (prop === "age" && value < 0) {
console.error("Age cannot be negative");
} else {
obj[prop] = value;
}
}
};
const proxy = new Proxy(target, handler);
proxy.age = -1; // μΆλ ₯: Age cannot be negative
proxy.age = 30; // μ μμ μΌλ‘ μ€μ λ¨
μ΄μμΌλ‘ κ°μ²΄μ λν Proxy μμ± λ°©λ²κ³Ό μ΄λ₯Ό ν΅ν κ°μ²΄ μ μ΄μ μ₯μ μ μ΄ν΄λ³΄μμ΅λλ€.
Proxy κ°μ²΄λ₯Ό μ¬μ©νλ©΄ κ°μ²΄μ λμμ μ¬μ©μ μ μλ‘ λ³κ²½ν μ μμΌλ©°, νλ‘νΌν° κ°μ λν μ ν¨μ± κ²μ¬λ₯Ό ν΅ν΄ κ°μ²΄μ μ ν©μ±μ 보μ₯ν μ μμ΅λλ€.