2011-11-29 78 views
2

我有使用dojo.declare()創建的類。有時候,我想添加另一個模塊(也是使用dojo.declare創建的),但是當我這樣做時,它似乎不成爲第一類的一部分。在Dojo類上調用構造函數使用dojo.extend擴展

這裏有一個簡單的例子:

dojo.declare('class1', 
    null, 
    { 
     constructor: function() 
     { 
      console.log('class1 constructor'); 
      this.inherited(arguments); 
     } 
    } 
); 

dojo.declare('class2', 
    null, 
    { 
     constructor: function() 
     { 
      console.log('class2 constructor'); 
     } 
    } 
); 

dojo.extend(class1, class2); 

var myclass = new class1(); 

你可以看到這裏的jsfiddle:http://jsfiddle.net/jdvRX/

我的目標重複此功能:

dojo.declare('class2', 
    null, 
    { 
     _class2_prop: true, 
     constructor: function() 
     { 
      console.log('class2 constructor'); 
     } 
    } 
); 

dojo.declare('class1', 
    class2, // class2 added as parent/mixin/module type thing 
    { 
     _class1_prop: true, 
     constructor: function() 
     { 
      console.log('class1 constructor'); 
     } 
    } 
); 

但只是有時...基本上,我想動態添加到class1的dojo.declare()的第二個參數。取決於其他因素,可能使用或不使用class2。

在現實世界的版本中,每個類都在一個單獨的文件中,並加載了dojo.require()。

我在做什麼錯?

感謝

回答

0

dojo.extend接收an object containing the properties to mix in,而不是一個額外的類。

所以你要做的

class1.extend({ 
    f2: function(){ console.log('class2'); } 
}) 

或許

class1.extend(class2.prototype) 

我不知道,如果你可以做同樣的構造繼承魔法從道場聲明雖然。也許你migh需要這些功能更改爲其它方法和/或做手工繼承

var oldF = class1.prototype.f 
class1.extend({ 
    f: function(){ 
     olfF.call(this); 
     console.log('more stuff'); 
    } 
}); 
0

我不知道這是否會夠你的情況,但maybie你可以指定你想擴展類你的主類變量,如下所示:

dojo.declare('class2', 
    null, 
    { 
     _class2_prop: true, 
     constructor: function() 
     { 
      console.log('class2 constructor'); 
     } 
    } 
); 
// set this to whatever class you want to use for extending class1, or to null 
var extendedClass = class2; 

dojo.declare('class1', 
    extendedClass, // class2 added as parent/mixin/module type thing 
    { 
     _class1_prop: true, 
     constructor: function() 
     { 
      console.log('class1 constructor'); 
     } 
    } 
); 


var myclass = new class1();