1

我有以下对象

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

如果我说o()我希望调用被代理,fn并且如果我说o.a应该返回 a 的值,是否可能完全按照它的呈现方式?

它更像是一个对象的未命名默认函数

4

2 回答 2

0

由于 JS 中的函数是对象,因此您可以使用属性对其进行扩展:

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

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

如果需要覆盖不可写的Function属性,比如name,可以先创建函数,然后用Object.defineProperties()来添加属性,将不可写变为可写。

注意:这感觉已经够骇人听闻了,而不会缺少函数的不可写属性。我建议避免它。

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

于 2018-03-05T12:50:59.807 回答
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; }

于 2018-03-05T12:48:10.350 回答