Javascript 您能否捕获/识别某个对象是否正在;援引;作为运行时的函数?

Javascript 您能否捕获/识别某个对象是否正在;援引;作为运行时的函数?,javascript,Javascript,给定一些基本类,例如此处的逻辑谓词类: const isACat = new Predicate(obj => obj.cat === true); 是否有方法确定/捕获/识别(可能通过反射?)正在“调用/评估isACat的上下文?“调用/评估”——因为我现在真的想不出更好的词来使用——我的意思是这样的: console.log(isACat(object1)); // being "invoked/evaluated" as a function console.

给定一些基本类,例如此处的逻辑谓词类:

const isACat = new Predicate(obj => obj.cat === true);
是否有方法确定/捕获/识别(可能通过
反射
?)正在“调用/评估
isACat
的上下文?“调用/评估”——因为我现在真的想不出更好的词来使用——我的意思是这样的:

console.log(isACat(object1));  // being "invoked/evaluated" as a function
console.log(isACat);           // being "invoked/evaluated" as a non-function
我的意思是“运行时”意义上的,而不是
typeof/instanceof
意义上的

用于执行或有行为的最终目标,例如(可能通过
代理
)返回默认函数(如果该实例作为函数被“调用/评估”)


编辑:也许更准确地说,当没有进一步的子道具通过时(即
isACat
,但不是
isACat[prop]
),是否存在“默认getter”这样的事情?

不,没有这样的事情。您只需访问一个变量,或者存储对象引用的任何内容,就可以得到一个引用值。对象本身对这个过程没有发言权——它甚至还没有被观察过。这不是“调用”或“评估”


实际上,如果您需要类似的内容,请显式调用,并编写
isACat()
(vs
isACat(object)
vs
isACat.prop()
).

我不是认真地建议你做下面介绍的任何事情,你会立即发现它们的局限性,但我认为演示是一种乐趣

[{dog:true},{cat:true}]。过滤器(isACat);//(引用(),[{cat:true}])
isACat({dog:true});//(引用(),false)
让生命=0;
lives+=ISCAT;//(引用(),7)
`Felix${isACat}`/(引用(),“Felix是一只猫”)
上面需要以下内容,您可以使用Babel插件或其他东西生成这些内容(我的意思是:显然,不要这样做)

const referenced=(obj)=>()=>{
log(obj,‘被引用’);
返回obj;
}
const_isACat=obj=>obj.cat==true;
Object.defineProperty(_iscat,'toString'{
值:()=>“是一只猫”
});
Object.defineProperty(_iscat,'valueOf'{
值:()=>7
});
Object.defineProperty(窗口'isACat'{
获取:引用(_iscat)
});
我不知道我最喜欢的是什么:通过getter欺骗期望、魔法类型强制或局部变量泄漏到全局范围。这是纯诗


更严重的是,我不认为Javascript是实现这一点的语言,但如果出于某种原因,您需要元编程能力,也许可以尝试一下Clojure。您也可以将宏与ClojureScript一起使用,它可以编译为Javascript并具有Javascript互操作性,但运行时/编译时的区别会限制您的操作。

我认为您要查找的单词是“引用的”,不,我认为您不可能想要什么。可以将其视为对使用标量值发出警报的等价物。如果您备份并询问原始X,这将很有帮助。您可以检测某个对象是否被作为函数调用,并且可以判断某个对象是否被取消引用。但是为了调用某个东西,你必须先去引用它。而且解引用可能发生在前一行,在另一个函数的代码中,等等。因此检测
isACat(object1)
很容易。但是检测ISCAT实际上是不可能的。检测
obj.isACat
是可能的,但是如果你这样做
让isACat=obj.isACat
,你就无法检测到
isACat
本身的进一步使用。@code学徒我想我想要的一般想法是在
谓词的情况下,在以下情况下,我希望返回值为
unknown
:无参数、
null
未定义
,或者其他情况;在传递参数的情况下,它应该执行实际的计算。这在
isACat()
情况下是微不足道的,但我想——在某种意义上——我希望
谓词
是“未知的”
除非计算实际发生并且实际上是
真的
/
假的
。虽然听起来这不太可能。@马特听起来像是想要
const returnValue=somePredicate。这不仅是不可能的,也没有意义——返回值和谓词函数是两个不同的东西,但是JS赋值将相同的值存储在目标变量中。这是一个有趣的片段。我喜欢元编程的想法,这可能是一个可以玩得更多的东西。谢谢