我想知道与本地类的桥接在内部是如何工作的。(找不到任何相关文档)。
function NativeClass() { this.foo = "bar"; }
class MyClass <
NativeClass ; end
它是否类似于ES6或coffeescript的继承(从JS的角度)?
是否可以在函数上定义可以像常规方法一样调用的方法(如:
) RubyClass
' .prototype '。foo = function(){返回RubyClass实例' @accessor} ) not the
.$foo ' .
还有一件事如果Ruby类继承了原生类,是否可以在该函数中引用将被实例化的Foo类的实例,如function(){this.bar = Foo's instance}?
是否有可能从Ruby类返回本机类(从本机继承)(例如,如果一些JS库需要本机类作为参数)?
基本上,任何Opal类都是带有一些附加属性的类class的完整对象实例。在此上下文中最相关的是$$proto
,它保存了类的原型,$$alloc
保存了原始的类构造函数。
映射C-Ruby实现#allocate
将在内部调用$$alloc
, Class#new
将依次调用#allocate
和#initialize
(就像常规Ruby一样)。
大多数桥接类都是构建一个完整的Class
实例,并注入原生JS类的原型和构造函数。然后复制BasicObject
中的方法,并(IIRC)将Kernel
混合在一起。
要了解更多细节,我建议直接从Opal来源阅读相关部分。当我这样做的时候,我学到了很多!:)
起始点有:
- 在runtime.js中检查传递的超类是否为函数
- 类。参考
Class
中的
.new
和#allocate
方法