我在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获取了上述方法,并根据我的需要进行了调整,但无论如何它都无法正常工作,浏览器也会退出同样的错误。慢慢地,我变得严肃起来。 :)
有人知道我做错了什么以及工作解决方案会是什么样子?
谢谢
乌
答案 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。
如果您希望更舒适(=不必使用apply
和call
,并且 - 如果您正在使用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
正如我所说,我是这个框架的开发者;)