使用 John Resig 的"simple JavaScript inheritance"如何从方法中调用超级方法和额外代码?



我决定尝试一下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方法中调用Personinitccupation属性插入额外的代码行。

不过我不能用雷西格的密码。以下不起作用:

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;
    }
});

最新更新