2011-08-27 62 views
1

我創建了一個超類Control和一個子類LEDControl的初始值設定項設置了幾個屬性,如高度,寬度,這種類型的stuf。但是,當我創建一個LED的實例時(用正確的數據填充它應該繼承的屬性)時,記錄實例時不會顯示繼承的屬性。Prototypejs子類不會繼承超類的屬性

這裏有兩個構造函數:

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

如果你想呼叫超類方法,你應該實際這樣做:

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

(或類似的東西)。無論如何,只要提到像你的代碼那樣的變量就沒有任何作用。

編輯 —根據原型文檔,「$超級」是父類函數的引用,所以如果你想打電話給它,你將有一個「控制」參數來傳遞。我不知道應該是什麼,但是你的基類「initialize()」顯然希望它是非null的東西。

真的,它看起來對我來說,就好像你的子類「初始化()」是不是真的以下父類的API模式:

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

好像它更接近你想要什麼。

+0

原來是這樣的,謝謝:)記錄$超級返回一個函數,這就是讓我困惑,我不知道如何工作。對我來說,讓子類需要超類所期望的相同參數也似乎很奇怪,但也許我的OOP思維需求正在增長。 –