Prototypejs子类不继承超类属性

时间:2011-08-27 12:10:43

标签: javascript inheritance attributes prototypejs

我创建了一个超类Control和一个子类LEDControl的初始化程序设置了几个属性,比如高度,宽度,那种stuf。但是,当我创建LED的实例时 - 使用适当的数据来填充它应该继承的属性 - 在记录实例时不会显示继承的属性。

以下是两个构造函数:

var Control = Class.create({
    initialize: function(control){
        log('info','Beginning creation of control using following control object.');
        log('log',control);

        // Define self to prevent conflicts with frameworks
        if(!self){ var self = this; }

        this.type = null;
        this.size = { w: control.w, h: control.h };
        this.position = { x: control.x, y: control.y };
        this.color = control.color;
        this.name = control.name;
        this.active = false;
    }
});

var LED = Class.create(Control,{
    initialize: function($super){
        $super;
        this.type = "led";
    }
});

我创建了一个小型Heroku网站来演示:http://blazing-dusk-603.heroku.com/interfaces/16,如果你打开控制台,你会看到大量的日志,底部的那个是LED的实例,没有大小,位置,颜色,名称或活动属性。

这是我第一次使用prototypejs继承,所以也许我误解了一些东西,当然可以理解帮助;)

1 个答案:

答案 0 :(得分:1)

如果你想调用超类方法,你可能应该这样做:

  $super.call(this, this); // not exactly sure what "$super" is supposed to be
  $super.initialize(this); // maybe?

(或类似的东西)。在任何情况下,只需像代码一样提及变量就没有效果。

编辑 - 根据Prototype文档,“$ super”是对父类函数的引用,因此如果要调用它,则必须传入“control”参数。我不知道那应该是什么,但你的基类“initialize()”显然希望它是非空的。

真的,它看起来好像你的子类“initialize()”并没有真正遵循父类的API模式:

var LED = Class.create(Control, {
  initialize: function($super, control) {
    $super.call(this, control);

似乎更接近你想要的东西。