Transcrypt:继承自 JS 原型?

Transcrypt: Inherit from a JS prototype?

有什么方法可以从 JS 原型继承 Transcrypt class?我有一个 JS 对象类型,它有很多我需要保留的功能,但我想用 Transcrypt class 中的很多不错的功能来扩展它(特别是,我'我想用 Transcript 运算符重载来补充笨重的 JS 数学函数)。

我试过显而易见的方法:

class MyClass (MyJSClass):
    ....

但这不起作用,因为 JS class 没有 Transcrypt 的 "magic methods"。

我也试过向 JS 原型添加方法:

def add_repr(orig):
    def v_repr(self):
        return "(inherited JS Object)"
    orig.prototype.__repr__ = v_repr

add_repr(MyJSClass)

print (__new__(MyJSClass()))

但在那种情况下,repr 永远不会被调用,因为 Transcrypt 正在寻找其他魔术方法或标识符但没有找到它们,所以它不会去寻找 repr

有没有人想出一种方法来追溯地将 JS 原型转换为 Transcrypt class 或从 JS 原型继承 Transcrypt class?

如您所见,Transcrypt classes 在内部不同于 JavaScript classes,因为它支持多重继承和绑定函数分配。

一个干净的解决方案是制作一个 Transcrypt facade class,封装相应的 JavaScript class.

所以要使 Transcrypt class Y_tr(和其他 classes)继承自 JavaScript class X_js,定义一个 Transcrypt class X_tr 具有 class X_js 的对象 x_js 作为其唯一属性(由 X_tr.__init__ 创建)。然后,您可以让 Y_tr 继承自 X_tr 而不是 X_js.

假设 X_js 有方法 m_am_b,然后给 X_tr 也使用该名称的方法。方法 X_tr.m_a 仅调用 x_js.m_a,而 X_tr.m_b 仅调用 x_js.m_b,返回各自的结果。

可以通过具有相同名称的 X_tr 的属性访问 x_js 的属性。

请注意,X_trY_tr 可以在不使用 __new__ 的情况下实例化,因为 self.x_js = __new__ (X_js ()) 是在 X_tr.__init__ 中完成的。