检测调用的对象何时被调用。访问器或作为函数调用
Detecting when an object called is called by . accessor or as function call
我有以下对象
let o = {
fn:()=>1,
a:2
}
如果我说 o()
我希望将呼叫代理到 fn
如果我说 o.a
应该返回 a 的值,是否可能完全按照原样返回呈现?
它更像是为一个对象设置了一个未命名的默认函数
Is it possible exactly as it is presented?
不,你不能,因为那只是一个 key-value
对象而不是一个函数。
您需要将该对象声明为函数:
- 在函数
o
中声明函数 fn
。
- 将名为
a
的属性设置为当前函数 o
。
let o = () => {
fn = () => 1;
o.a = 2;
return fn();
};
console.log(o());
console.log(o.a);
.as-console-wrapper { max-height: 100% !important; top: 0; }
由于JS中的函数是对象,你可以用属性来扩展它们:
const o = Object.assign(() => o.fn(), {
a: 5,
fn: () => 1
});
console.log(o());
console.log(o.a);
如果需要覆盖non-writable函数属性,比如name
,可以先创建函数,然后用Object.defineProperties()
添加属性,改成non-writables 到可写对象。
注意:这感觉够老套了,没有遗漏函数的 non-writable 属性。我建议避免使用它。
const o = () => o.fn();
Object.defineProperties(o, {
fn: { value: () => 1 },
a: { value: 5 },
name: { writable: true, value: 'whatever' },
});
console.log(o());
console.log(o.a);
console.log(o.name);
我有以下对象
let o = {
fn:()=>1,
a:2
}
如果我说 o()
我希望将呼叫代理到 fn
如果我说 o.a
应该返回 a 的值,是否可能完全按照原样返回呈现?
它更像是为一个对象设置了一个未命名的默认函数
Is it possible exactly as it is presented?
不,你不能,因为那只是一个 key-value
对象而不是一个函数。
您需要将该对象声明为函数:
- 在函数
o
中声明函数fn
。 - 将名为
a
的属性设置为当前函数o
。
let o = () => {
fn = () => 1;
o.a = 2;
return fn();
};
console.log(o());
console.log(o.a);
.as-console-wrapper { max-height: 100% !important; top: 0; }
由于JS中的函数是对象,你可以用属性来扩展它们:
const o = Object.assign(() => o.fn(), {
a: 5,
fn: () => 1
});
console.log(o());
console.log(o.a);
如果需要覆盖non-writable函数属性,比如name
,可以先创建函数,然后用Object.defineProperties()
添加属性,改成non-writables 到可写对象。
注意:这感觉够老套了,没有遗漏函数的 non-writable 属性。我建议避免使用它。
const o = () => o.fn();
Object.defineProperties(o, {
fn: { value: () => 1 },
a: { value: 5 },
name: { writable: true, value: 'whatever' },
});
console.log(o());
console.log(o.a);
console.log(o.name);