Вы можете сделать это с помощью Proxy
в ES2015 и выше;вы не можете сделать это в ES5 и ниже.
Если вы действительно хотите, чтобы каждое возможное свойство возвращало эту магическую функцию, то это довольно просто:
const obj = {};
const magic = () => 1;
const p = new Proxy(obj, {
get(target, prop, receiver) {
return magic;
}
});
console.log(p.foo()); // returns 1
console.log(p.bar()); // returns 1
console.log(p.baz()); // returns 1
Если вы хотите, чтобы объект имел другие свойства, и возвращали их значения, если они есть, но магическую функцию, если нет, вы должны использовать Reflect.has
, чтобы увидеть, есть ли у объекта свойство, а затем Reflect.get
, чтобы получить его, если так:
const obj = {
notMagic: 42
};
const magic = () => 1;
const p = new Proxy(obj, {
get(target, prop, receiver) {
// If the object actually has the property, return its value
if (Reflect.has(target, prop)) {
return Reflect.get(target, prop, receiver);
}
// Return the magic function
return magic;
}
});
console.log(p.foo()); // returns 1
console.log(p.bar()); // returns 1
console.log(p.baz()); // returns 1
console.log(p.notMagic); // 42
Если бы вы хотели, чтобы функция видела this
в качестве объекта, вы бы использовали функцию без стрелки и, вероятно, bind
, чтобы упростить задачу:
const obj = {
notMagic: 42
};
const magic = function() {
console.log(this === obj);
return 1;
}.bind(obj);
const p = new Proxy(obj, {
get(target, prop, receiver) {
// If the object actually has the property, return its value
if (Reflect.has(target, prop)) {
return Reflect.get(target, prop, receiver);
}
// Return the magic function
return magic;
}
});
console.log(p.foo()); // returns 1
console.log(p.bar()); // returns 1
console.log(p.baz()); // returns 1
console.log(p.notMagic); // 42