我最近通过编写一些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.
}
到目前为止,我认为这是创建一个基本上是Superclass加上额外内容的类Subclass的标准方式。我假设每个对象都有一个_init方法。
最近我尝试使用相同的方法来创建一个Clutter.Actor的子类(重要的是它不是GNOME-shell定义的类),并意识到上述对象的子类化方式不是标准方式。首先,并不是我所想象的每个类都有一个_init函数;这只是GNOME-shell在他们的javascript类中所做的事情。
因此,我的问题是:
1. 是否有关于创建子类的上述方法的任何文档?我看过的所有教程都说要设置Subclass.prototype = new Superclass(),而不是采用Subclass.prototype = { __proto__:Superclass.prototype, define_prototype_methods_here }方法,但我的想法是,如果gnome-shell一直使用这种方法,肯定有某种方法? 2. 如果我想尽可能接近定义类的上述方式(只是为了保留一些与我编写扩展程序的GNOME-shell代码相似的代码),我应该用什么替换Superclass.prototype._init.call(this)在Subclass._init中,以确保Subclass.prototype获得Superclass的所有方法/属性(然后我在Subclass.prototype的定义中添加它们),如果Superclass没有_init函数(即它是否有一些等效的构造函数我可以调用)?
我对此非常困惑,所以请原谅我如果我的问题不太合理;这将是因为我对此的误解和困惑!