我最近一直在通过编写一些 gnome shell 扩展来学习 javascript,因此我对 Javascript 的理解受到了我在 gnome-shell javascript 源代码中观察到的示例的影响。我有一种感觉,我一直在理解错误的类,只是想澄清一下。
我已经编写了一些自己的子类,并且在每种情况下,我都通过遵循 gnome-shell javascript 源代码中的类似代码来简单地定义它们:
Subclass = function() {
this._init.apply(this,arguments);
}
Subclass.prototype = {
__proto__: Superclass.prototype,
_init: function() {
Superclass.prototype._init.call(this);
},
// add other methods of Subclass here.
}
到目前为止,我认为这是制作Subclass
基本上是Superclass
附加功能的课程的标准方式。我假设每个对象都有一个_init
方法。
我最近尝试应用相同的方法来创建 a 的子类Clutter.Actor
(重要的是它不是 GNOME-shell 定义的类),并意识到上述子类化对象的方式不是标准。一方面,并非每个类都具有_init
我假设的功能。这只是 GNOME-shell 在他们的 javascript 类中所做的事情。
所以,我的问题是:
- 是否有关于上述创建子类的方法的文档?我见过的所有教程都说要设置
Subclass.prototype = new Superclass()
而不是执行该Subclass.prototype = { __proto__:Superclass.prototype, define_prototype_methods_here }
方法,但我的想法是,如果 gnome-shell 始终使用它,则必须有一些方法? - 如果我想尽可能地接近上述定义类的方式(这样我可以保留一些与我正在为其编写扩展的 GNOME-shell 的代码相似性),我应该用什么替换
Superclass.prototype._init.call(this)
以确保Subclass._init
得到Subclass.prototype
所有的方法/属性Superclass
(然后我在我的定义中添加Subclass.prototype
),如果Superclass
没有_init
函数(即它是否有一些我调用的等效构造函数)?
我真的对这一切感到困惑,所以如果我的问题没有多大意义,请原谅我;这将是因为我的误解和困惑的程度!
编辑:澄清: - 我知道__proto__
不推荐,因为它是非标准的,但我的代码永远不会在浏览器中运行 - 它只会使用 GNOME javascript(基本上是 Mozilla javascript 引擎)运行,所以我不需要担心交叉兼容性。