我有以下对象
let o = {
fn:()=>1,
a:2
}
如果我说o()
我希望调用被代理,fn
并且如果我说o.a
应该返回 a 的值,是否可能完全按照它的呈现方式?
它更像是一个对象的未命名默认函数
我有以下对象
let o = {
fn:()=>1,
a:2
}
如果我说o()
我希望调用被代理,fn
并且如果我说o.a
应该返回 a 的值,是否可能完全按照它的呈现方式?
它更像是一个对象的未命名默认函数
由于 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);
是否可能完全按照它的介绍?
不,你不能,因为那只是一个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; }