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
将在内部调用 $$alloc
而 Class#new
将依次调用 #allocate
和 #initialize
(就像常规的 Ruby).
从桥接 classes 开始构建一个完整的 Class
实例并注入原生 JS class 的原型和构造函数。然后 BasicObject
中的方法被复制过来,并且 (IIRC) Kernel
被混入。
有关更多详细信息,我建议直接从 Opal 来源阅读相关部分。当我这样做的时候,我学到了很多东西! :)
一些起点是:
- runtime.js 其中传递的 superclass 被检查为函数
- class.rb 来自
Class
的 .new
和 #allocate
方法
我想知道桥接到本机 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
将在内部调用 $$alloc
而 Class#new
将依次调用 #allocate
和 #initialize
(就像常规的 Ruby).
从桥接 classes 开始构建一个完整的 Class
实例并注入原生 JS class 的原型和构造函数。然后 BasicObject
中的方法被复制过来,并且 (IIRC) Kernel
被混入。
有关更多详细信息,我建议直接从 Opal 来源阅读相关部分。当我这样做的时候,我学到了很多东西! :)
一些起点是:
- runtime.js 其中传递的 superclass 被检查为函数
- class.rb 来自
Class
的
.new
和 #allocate
方法