扩展类并调用超级方法

时间:2015-12-23 12:25:58

标签: javascript

我尝试创建一个函数来扩展JavaScript中的“类”。

function Extend(clazz, extend, info) {
    var properties  = {};

    if(typeof(info) != 'undefined') {
        properties.info = {
            value: info
        };
    } else {
        properties.info = {
            value: {
                name:       'Unknown',
                author:     'Unknown',
                version:    '0.0.0'
            }
        };
    }

    clazz.prototype = Object.create(extend.prototype, properties);
    eval(clazz.name + ' = clazz;');
}

这是超级班:

function Module() {
    this.isRegistred = function isRegistred() {
        return true;
    };

    this.start = function start() {
        /* Override Me */
    };

    this.stop = function stop() {
        /* Override Me */
    };

    this.kill = function kill() {
        /* Override Me */
    };

    this.onJoin = function onJoin(user) {
        /* Override Me */
    };

    this.onLeave = function onLeave(user) {
        /* Override Me */
    };

    this.onDice = function onDice(event) {
        /* Override Me */
    };

    this.onMessage = function onMessage(sender, text, receiver) {
        /* Override Me */
    };
};

这里是扩展样本:

/**
    @author     Adrian Preuß <a.preuss@ChannelApp.de>
    @version    1.0.0
*/

Extend(function Welcome() {
    this.onJoin = function onJoin(user) {
        user.sendPrivateMessage('Welcome!');
    };
}, Module, {
    name:       'Welcome',
    author:     'Adrian Preuß',
    version:    '1.0.0'
});

当我尝试启动该类并尝试调用超级方法时(请参阅以下示例),出现错误“函数未知”:

var test = new Welcome();

test.onJoin(new User()); // It work's

console.log(test.info); // The info from the third args

if(test.isRegistred()) { // functtion is not defined
    // Do something...
}

1 个答案:

答案 0 :(得分:0)

您尝试延长prototype,但您首先不使用prototype

使用this将函数分配给类时,将函数分配给实例,而不是类本身。如果您查看Module.prototype,它将不包含您的任何方法。

解决问题的简洁方法是将您的功能声明为prototype

function Module() {}

Module.prototype.isRegistred = function isRegistred() {
    return true;
};

// And so on...