Javascript继承私有对象 - 更具体的可观察模式

时间:2015-01-15 22:06:08

标签: javascript oop inheritance observer-pattern

我一直在研究应用程序的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是什么,所以我可以追求和调查它。

谢谢,

赛斯

0 个答案:

没有答案