使用dojo.extend在Dojo类上调用构造函数

时间:2011-11-29 10:38:56

标签: javascript dojo

我有一个使用dojo.declare()创建的类。有时,我想添加另一个模块(也是用dojo.declare创建的),但是当我这样做时,它似乎不会成为第一个类的一部分。

这是一个简化的例子:

 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()。

我做错了什么?

由于

2 个答案:

答案 0 :(得分:0)

dojo.extend接收an object containing the properties to mix in而不是额外的类。

所以你必须这样做

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

或者

class1.extend( class2.prototype )

我不确定你是否可以从dojo声明中执行相同的构造函数继承魔法。也许您需要将该功能更改为另一种方法和/或手动执行继承

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

答案 1 :(得分:0)

我不知道这对你的情况是否足够,但是你可以将你想要扩展主类的类分配给变量,如下所示:

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