我一直在研究应用程序的javascript层,并尽可能地努力实现OOP,主要是包含Observable / Observer模式。当然我不知道如何进行多重继承(甚至多个像带接口的Java),但我真的不需要这个 - 我可以做一个简单的测试来确定传递的对象是否具有某个属性/函数/方法)
无论如何,虽然我可以公开一些公共方法并使用我的私有方法,但是一旦进入子类,我发现调用父类方法导致在Chrome的调试器中未定义此方法。我希望能够抽象出来并尝试使用function.prototype.extend但是当它不起作用时,我将其简化为简单。这是简单的javascript代码:
var Observable = (function () {
var mArrObservers = undefined;
var mbChanged = false;
mArrObservers = new buckets.LinkedList(); // oops this is the buckets js library
mbChanged = false;
return ({
addObserver: function (objObserver) {
if (objObserver.hasOwnProperty('update'))
mArrObservers.add(objObserver)
else
throw "Observer must have implemented 'update' method";
},
clearChanged: function () {
this.setChanged(false);
},
countObservers: function () {
return (mArrObservers.size());
},
deleteObserver: function (objObserver) {
mArrObservers.remove(objObserver, function (objObserver1, objObserver2) {
return (objObserver1 == objObserver2);
});
},
deleteObservers: function () {
mArrObservers.clear();
},
hasChanged: function () {
if (typeof (mbChanged) == "undefined")
mbChanged = false;
return (mbChanged);
},
notifyObservers: function (objArgument) {
mArrObservers.forEach(function (objArg) {
if (objArgument)
objArg.update(objArgument);
else
objArg.update();
});
},
setChanged: function (bChanged) {
if (typeof (bChanged) == "undefined")
mbChanged = true;
else
mbChanged = bChanged;
}
});
});
var Entity = (function () {
var miId = 0;
var objReturn = new Observable();
objReturn.prototype.getId = function () {
if (typeof (miId) == "undefined")
miId = 0;
return (miId);
};
objReturn.prototype.setId = function (iId) {
if (typeof (iId) == "undefined")
miId = 0;
else
miId = iId;
this.setChanged();
this.notifyObservers();
};
return (objReturn);
});
$(document)
.ready(function () {
var objEntity = new Entity();
objEntity.addObserver({
update: function () {
alert('Hi');
}
});
objEntity.setChanged();
objEntity.notifyObservers();
});
是的,Observable类是在java.util.Observable类之后建模的,但并不精确,只是我觉得我需要的。当我到达addObserver时,调试器拒绝它,因为没有定义。我可能做错了什么?我尝试了很多方法,一些纯Javascript,另一些来自API。我很开心 - 如果一个特定的API请说明API是什么,所以我可以追求和调查它。
谢谢,
赛斯