检测调用的对象何时被调用。访问器或作为函数调用

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);