Opal.rb 桥接 class 内部机制

Opal.rb bridged class inner mechanics

我想知道桥接到本机 classes 在内部是如何工作的。 (找不到任何相关文档)。

function NativeClass() { this.foo = "bar"; } class MyClass <NativeClass; end

是否类似于ES6或coffeescript的继承(从JS角度)?

是否可以在函数上定义可以像常规方法一样调用的方法(例如:

RubyClass`.prototype`.foo = function(){return Ruby类实例'@accessor}) not the.$foo`.

还有一件事。 如果 Ruby class 是从原生 class 继承的, 是否可以在该函数中引用将要实例化的 Foo class 实例,例如 function(){this.bar = Foo's instance}?

是否可以从Rubyclass(从原生继承)return原生class(例如,如果某些JS库需要原生class 作为 arg)?

基本上任何蛋白石 class 都是 class Class 的完整对象实例,具有一些额外的属性。在这种情况下最相关的是$$proto,它持有class'原型和$$alloc,它持有原始的class构造函数。

映射 C-Ruby 实现 #allocate 将在内部调用 $$allocClass#new 将依次调用 #allocate#initialize (就像常规的 Ruby).

从桥接 classes 开始构建一个完整的 Class 实例并注入原生 JS class 的原型和构造函数。然后 BasicObject 中的方法被复制过来,并且 (IIRC) Kernel 被混入。

有关更多详细信息,我建议直接从 Opal 来源阅读相关部分。当我这样做的时候,我学到了很多东西! :)

一些起点是:

  • runtime.js 其中传递的 superclass 被检查为函数
  • class.rb 来自 Class
  • .new#allocate 方法