[英]Inheritance in Javascript, What am I doing wrong here?
嗨,我对javascript非常陌生。 我被赋予创建一个javascript框架的任务,以加载多个电子学习模块并使它们通过xml相互交互。
我正在使用一种继承方法,如下所示。
基类EventDispatcher:
(function (window) {
var EventDispatcher = function () {
this._listeners = [];
}
var p = EventDispatcher.prototype;
p._listeners = [];
p.addListener = function (type, listener, scope) {
scope = (typeof scope !== "undefined") ? scope : this;
if (typeof this._listeners[type] == "undefined") {
this._listeners[type] = [];
}
this._listeners[type].push({
listener: listener,
scope: scope
});
}
p.removeListener = function (type, listener) {
if (this._listeners[type] instanceof Array) {
var listeners = this._listeners[type];
for (var i = 0, len = listeners.length; i < len; i++) {
if (listeners[i].listener === listener) {
listeners.splice(i, 1);
break;
}
}
}
}
p.dispatchEvent = function (event) {
if (typeof event == "string") {
event = {
type: event
};
}
if (!event.target) {
event.target = this;
}
if (!event.type) {
throw new Error("Event object missing 'type' property.");
}
if (this._listeners[event.type] instanceof Array) {
var listeners = this._listeners[event.type];
for (var i = 0, len = listeners.length; i < len; i++) {
listeners[i].listener.call(listeners[i].scope, event);
}
}
}
window.EventDispatcher = EventDispatcher;
}(window));
继承EventDispatcher的Sub XMLLoader类:
(function (window) {
var XMLLoader = function () {}
var p = XMLLoader.prototype = new EventDispatcher();
p.xmlhttp = null;
p.loadXML = function (url) {
if (this.xmlhttp == null) {
this.initXMLHttpRequest();
}
this.xmlhttp.open("GET", url, true);
this.xmlhttp.send();
}
p.initXMLHttpRequest = function () {
var currObj = this;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
this.xmlhttp = new XMLHttpRequest();
} else {
// code for IE6, IE5
this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
this.xmlhttp.onreadystatechange = function () {
var xmlLoaderEvent = null;
if (currObj.xmlhttp.readyState == 4 && currObj.xmlhttp.status == 200) {
xmlLoaderEvent = new XMLLoaderEvents();
xmlLoaderEvent.type = XMLLoaderEvents.XML_DOC_SUCCESS;
xmlLoaderEvent.data = {
xmlDoc: currObj.xmlhttp.responseXML,
xmlString: currObj.xmlhttp.responseText
};
} else if (currObj.xmlhttp.status == 404) {
xmlLoaderEvent = new XMLLoaderEvents();
xmlLoaderEvent.type = XMLLoaderEvents.XML_DOC_ERROR;
}
if (xmlLoaderEvent != null) {
currObj.dispatchEvent(xmlLoaderEvent);
}
};
}
/*p.onReadyStateChange = function()
{
var xmlLoaderEvent = null;
if(this.xmlhttp.readyState == 4 && this.xmlhttp.status == 200)
{
xmlLoaderEvent = new XMLLoaderEvents();
xmlLoaderEvent.type = XMLLoaderEvents.XML_DOC_SUCCESS;
xmlLoaderEvent.data = this.xmlhttp.responseXML;
}
else if(this.xmlhttp.status == 404)
{
xmlLoaderEvent = new XMLLoaderEvents();
xmlLoaderEvent.type = XMLLoaderEvents.XML_DOC_ERROR;
}
if (xmlLoaderEvent != null)
{
this.dispatchEvent(xmlLoaderEvent);
}
}*/
window.XMLLoader = XMLLoader;
}(window));
现在,我在另一个类中多次调用xmlLoader。 每次调用之前,我都会使用new XMLLoader();
创建一个新实例new XMLLoader();
。 我的理解是,这应该创建一个新实例,并且基类中的this._listeners
应该为[]
空。 但这没有发生。 请帮助我,告诉我我要去哪里了。
在javascript中模拟时,类继承无法正常工作。 例如,没有隐式超类构造函数调用。
您不要在“子类构造函数”中调用“母类”构造函数。 这就是为什么“母类”字段未初始化的原因。
代替
var XMLLoader = function () {}
你应该写的是
var XMLLoader = function () {
EventDispatcher.apply(this, arguments); /* this is a common way to execute
the code of the "mother class" "constructor" with the same "this" */
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.