【发布时间】:2012-05-14 08:53:21
【问题描述】:
我最近通过编写一些 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 方法。
我最近尝试应用相同的方法来创建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 引擎)运行,所以我无需担心交叉兼容性。
【问题讨论】:
-
这不是一个真正的答案,但我强烈推荐这个网站来提高你的 JS 知识:yuiblog.com/crockford
标签: javascript