我决定尝试一下JavaScript天才John Resig的"简单JavaScript继承",如下博客页面所述:
http://ejohn.org/blog/simple-javascript-inheritance/
我很好奇如何用调用超级方法的代码覆盖方法。换句话说,假设我从Person类开始:
var Person = Class.extend({
init: function ( name, age ) {
this.name = name;
this.age = age;
}
});
我扩展了Person类以创建一个新类Worker:
var Worker = Person.extend({
init: function ( name, age, occupation ) {
this.name = name;
this.age = age;
this.occupation = occupation;
}
});
在init方法的两个版本中有重复的代码。无论我使用哪个类,都会执行以下两行:
this.name = name;
this.age = age;
我似乎应该能够从Hero类的init方法中调用Person的initccupation属性插入额外的代码行。
不过我不能用雷西格的密码。以下不起作用:
var Worker = Person.extend({
init: function ( name, age, occupation ) {
this._super(arguments);
this.occupation = occupation;
}
});
一旦从Person调用的extend方法创建Worker类,就会看到*this_super(arguments)*它用Person的init替换了Worker的init的全部内容,留下了一个未定义的职业属性。
有人对如何在不修改Resig的代码的情况下绕过这一问题有什么建议吗?我目前正在尝试不同的方法来实现"超级"的概念,但我无法用现有的代码来实现这一点,这一事实一直萦绕在我的脑海中。:-)
更新:我意识到我在实现Resig先生的代码时犯了一个小错误,这就是为什么它会像我描述的那样@chuckj也正确地指出了Worker的init中的一个错误。
将Worker定义更改为,
var Worker = Person.extend({
init: function (name, age, occupation) {
this._super(name, age);
this.occupation = occupation;
}
});
您不传递arguments
数组,而是使用它期望的参数调用_super
。
您的目标似乎是将arguments
代理到this._super
。在这种情况下,您可以只apply()
它们:
var Worker = Person.extend({
init: function ( name, age, occupation ) {
this._super.apply(this, arguments);
this.occupation = occupation;
}
});