3

我在 javascript 中与 oop 争论了几天,但我没有找到解决方案。

我创建了 3 个对象,一个超类,一个子类和一个继承管理器,它们应该对我的子类执行所有“原型”魔术。

继承管理器:

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”未定义。

至少我从这里选择了上述方法并根据我的需要对其进行了调整,但无论如何它都不起作用,并且浏览器正在退出并出现同样的错误。慢慢地,我变得非常疯狂。:)

有人知道我做错了什么以及可行的解决方案如何?

谢谢

你做

4

3 回答 3

4

您需要调用doSetups属于父类的prototype.

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

如果您想了解不同的继承技术(特别是一种不需要调用者知道父类型的技术),您可能需要查看 CoffeeScript 的__extends函数,以及它是如何执行继承的。

于 2013-01-24T22:24:34.770 回答
3

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

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

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

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

TypedSectionHandler = SDSection.extend({
    doSetups: function(){
        ...
        this._super();
        ...
    }
});
于 2013-01-24T22:35:37.250 回答
0

如果你想自己做,你可以像voithos说的那样走——自己写有助于你肯定地理解 js OOP。

如果您想要更舒适(= 不必使用applycall- 如果您在 Visual Studio 2012 中开发 - base-methods/-constructor intellisense 支持)我希望您查看我写的一个框架: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 

免责声明:

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

于 2013-01-24T23:14:54.963 回答