我有以下对象
let o = {
fn:()=>1,
a:2
}
如果我说o()
我希望将呼叫代理到fn
,如果我说o.a
应该返回a的值,是否可能与呈现的完全相同?
更像是为对象设置一个未命名的默认函数
答案 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);