一切都很有趣,但在这种情况下,我将标记函数分配给函数
let fnc = function () { console.log("called");}
fnc.intrn = function (val) {console.log("called : ", val); }
你可以在它工作时调用它并且在那里
>fnc.intrn("yup")
called : yup
但如果您在控制台中键入 fnc,您只会看到。
>fnc
ƒ () { console.log("called");}
当然,如果您键入“func”。弹出一个列表,其中包含它拥有的所有内容,例如原型、构造函数、绑定、调用、调用者、长度、名称、intrn 等。
而 toString 只是显示函数的代码
>fnc.toString()
"function () { console.log("called");}"
我想你可以重写 toString (或制作另一个函数)来显示你想要的东西,或者代替。
在 Chrome 控制台的输出最右侧,您会看到 VM##:1 并且可以单击它,因为它与键入 toString() 相同
现在,如果您放置一个断点(在本例中位于第 1 行)并调用函数 fnc(),那么它将停止在 VM##:1 源上执行(未在源文件选项卡 ~ 网络、覆盖、文件系统中列出,片段)。 [没有像这样的控制台日志引用,右键单击“显示函数定义”技巧会更好(谢谢)。]
但是您可以首先在 Scope 和“脚本”(在本例中为“fnc”)下看到它,而大多数其他实体当然是在 __proto__ 下的父级,并且原型具有构造函数。
在那里您还可以看到包含 FunctionLocation 和 Scopes 的方括号,它们本身在 Script 中,而全局似乎是“this”又名 Window 的本地范围。
这不会与 Proto 的 FunctionLocation = unknown 或具有“无属性”的 Scope 混淆,因为我想有人可以说那是 Monadal。
好的,所以你可以通过两到三个迂回的方式到达那里,但在我看来这并不明显或特别好。也许可以将自定义显示隐藏函数对象参数函数添加到“对象”原型中,但这并不重要,我当时也在寻找编程解决方案?
好的,这时您可以在附加了隐藏函数(或你有什么)等的函数上使用 Object 的 getOwnPropertyNames。
>Object.getOwnPropertyNames(fnc)
(6) ["length", "name", "arguments", "caller", "prototype", "intrn"]