如何为 duktape 编写中央函数调度程序?

How to write a central function dispatcher for duktape?

情况是这样的:我想对我在对象 + 原型上定义的所有函数使用单个 duktape/C 函数。为此,我有一个函数映射,它接受一个函数名和一个回调(实际上是一个 std::function),并且可以很容易地进行一些常见的处理并具有更简单的回调(甚至可以为此使用就地 lambda)。

这已经很好地工作了,但有一个问题:不同对象上的相同命名函数。为了消除歧义,我现在使用对象(或原型,它也是一个对象)的堆指针作为进一步的限定符。因此,当我的中央 duktape/C 函数被调用时,我首先查看该函数是否是全局函数(即是在全局对象上定义的)。如果失败,我将获得 this 绑定并使用其堆指针进行查找。如果那也失败了,我将遍历原型链,看看是否可以在其中一个原型上找到该函数。

这对 99% 都有效,除非我没有 this 绑定(或错误的绑定,例如 Function.prototype.apply())。

我的问题是:如何在中央 duktape/C 回调中获取函数的原始原型?

答案比我最初想的要简单。对于该中央功能映射,您需要具有功能名称。在对象或原型上定义新函数时,必须在创建的函数对象上将其设置为 属性。

原来的object/prototype也可以使用同样的方法。只需将对它的反向引用作为另一个 属性(例如 "ptr")添加到您的函数对象。有了它,您不仅可以轻松获得函数的名称,还可以轻松获得它执行的上下文。由于我们已经有了正确的 object/prototype.

,因此无需遍历继承链