检测被调用对象何时被调用。访问者或函数调用

时间:2018-03-05 12:43:22

标签: javascript ecmascript-6 es6-proxy

我有以下对象

let o = {
    fn:()=>1,
    a:2
}

如果我说o()我希望将呼叫代理到fn,如果我说o.a应该返回a的值,是否可能与呈现的完全相同?

更像是为对象设置一个未命名的默认函数

2 个答案:

答案 0 :(得分:0)

  

是否有可能完全呈现?

不,你不能,因为那只是一个key-value对象,而不是一个函数。

您需要将该对象声明为函数:

  • 在函数fn中声明函数o
  • 将名为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; }

答案 1 :(得分:0)

由于JS中的函数是对象,因此可以使用属性扩展它们:



const o = Object.assign(() => o.fn(), {
  a: 5,
  fn: () => 1
});

console.log(o());
console.log(o.a);




如果需要覆盖不可写的函数属性,例如name,则可以先创建函数,然后使用Object.defineProperties()添加属性,并将不可写入的内容更改为可写入。 / p>

注意:这样会感到非常骇人听闻,而不会错过函数的不可写属性。我建议避免它。



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