Javascript - 继承和调用来自child的父方法

时间:2013-01-24 22:08:30

标签: javascript methods call prototype parent

我在javascript中使用oop进行了几天的斗争,但我找不到解决方案。

我已经创建了3个对象,一个超类,一个子类和一个inheritance_manager,它应该对我的子类执行所有“原型”-magic。

继承经理:

Inheritance_Manager = {};
Inheritance_Manager.extend = function(subClass, baseClass) {
    function inheritance() {
    }
    inheritance.prototype = baseClass.prototype;
    subClass.prototype = new inheritance();
    subClass.prototype.constructor = subClass;
    subClass.baseConstructor = baseClass;
    subClass.superClass = baseClass.prototype;
};

超级(父级)课程:

SDSection = function(sectionId, resourceId) {

    this.self = this;
    this.sectionId = sectionId;
    this.resourceId = resourceId;

    ...
};

SDSection.prototype.doSetups = function() {
        ...
};

儿童班:

TypedSectionHandler = function(sectionId, resourceId) {
    SDSection.call(this, sectionId, resourceId);
        ...
};

Inheritance_Manager.extend(TypedSectionHandler, SDSection);

TypedSectionHandler.prototype.doSetups = function() {
        ...
    SDSection.doSetups.call(this);
        ...
};

我想做的事情很简单,就像php或java等其他编程语言一样。我想从类型为“TypedSectionHandler”的子类中的方法“doSetups”中调用父类“SDSection”中的覆盖“doSetups”方法。

我现在正在努力解决这个问题大约1周,我尝试了不同的解决方案,从基本到更复杂,但似乎没有任何效果。

每次执行脚本时,例如在chrome或firefox中,我将得到错误“无法调用未定义的方法调用”或更简单,“SDSection.doSetups”未定义。

至少我从here获取了上述方法,并根据我的需要进行了调整,但无论如何它都无法正常工作,浏览器也会退出同样的错误。慢慢地,我变得严肃起来。 :)

有人知道我做错了什么以及工作解决方案会是什么样子?

谢谢

3 个答案:

答案 0 :(得分:4)

您需要调用属于父类doSetups的{​​{1}}函数。

prototype

如果您想查看不同的继承技术(特别是那些不需要调用者知道父类型的技术),您可能需要查看CoffeeScript的TypedSectionHandler.prototype.doSetups = function() { ... SDSection.prototype.doSetups.call(this); ... }; 函数以及它如何执行继承。

答案 1 :(得分:3)

如果您正在使用纯JavaScript,请使用voithos解决方案。我喜欢在我目前的项目中使用John Resig的simple inheritance snippet。在minification之后它只有521个字节,没有依赖关系,在你的情况下它会像这样工作:

SDSection = Class.extend({
    init: function(sectionId, resourceId) {

        this.sectionId = sectionId;
        this.resourceId = resourceId;

        ...
    },
    doSetups: function(){
        ...
    }
});

TypedSectionHandler = SDSection.extend({
    doSetups: function(){
        ...
        this._super();
        ...
    }
});

答案 2 :(得分:0)

如果你想自己做,你可以像 voithos 那样说 - 自己写一下就可以帮助你理解js OOP。

如果您希望更舒适(=不必使用applycall,并且 - 如果您正在使用Visual Studio 2012进行开发 - 基础-methods / -constructor intellisense support )我希望你看一下我写的框架: jsframework

有了它,您可以轻松编写样本:

SDSection = new Class(Object, function(base, baseConstructor)
{
    // member fields for prototype
    this.self = null;
    this.sectionId = -1;
    this.resourceId = -1;

    // constructor
    this.init = function(sectionId, resourceId)
    {
        this.self = this;
        this.sectionId = sectionId;
        this.resourceId = resourceId;
    };

    // member functions
    this.doSetups = function() 
    {
        console.log("SDSection doSetups: " + this.sectionId + "/" + this.resourceId);
    };
});

TypedSectionHandler = new Class(SDSection, function(base, baseConstructor)
{
    this.anotherId = -2;

    // constructor
    this.init = function(sectionId, resourceId, anotherId) 
    {
        baseConstructor(sectionId, resourceId);

        this.anotherId = anotherId;
    };

    // member functions
    this.doSetups = function() 
    {
        // call base function
        base(this).doSetups();
        console.log("TypedSectionHandler doSetups: " + this.anotherId);
    };
});

var t = new TypedSectionHandler(1, 2, 3);
t.doSetups();
console.log(t instanceof TypedSectionHandler);
console.log(t instanceof SDSection);

这是一个有效的jsfiddle:http://jsfiddle.net/QYXSr/1/

输出:

SDSection doSetups: 1/2
TypedSectionHandler doSetups: 3
true
true 

声明:

正如我所说,我是这个框架的开发者;)