Private fields: using prototype, basic idea

by mbread

JavaScript

//***********************************
// Each class
//***********************************

var Class1 = (function () {
    var private = null;

    var Class1 = function () {
        var _private = {};
        this.loadPrivate = function () {
            private = _private;
        }
    };

    
    Class1.prototype.myField = function () {
        this.loadPrivate();
        try {
            switch (arguments.length) {
                case 0:
                    return private.myField;
                case 1:
                    private.myField = arguments[0];
                    break;
            }
        } finally {
            private = null;
        }
    }

    return Class1;
}());

//***********************************
// Tests
//***********************************

function assertEquals(msg, expected, actual) {
    if (expected == actual) {
        console.debug("Passed: " + expected + " == " + actual);
    } else {
        console.error("Failed: " + msg + " Expected: " + expected + " Actual: " + actual);
    }
}

console.info("----- Starting tests --------------------------------------------------------------------------"); {
    var o1 = new Class1();
    o1.myField("value");
    assertEquals("myfield() with no args should return the argument passed to previous call", "value", o1.myField());
}

{
    var o1 = new Class1();
    assertEquals("myField() with one arg should return nothing", undefined, o1.myField("value"));
}

{
    var o1 = new Class1();
    o1.myField(1);
    var o2 = new Class1();
    o2.myField(2);
    assertEquals("A first object should still return the same value even after a second object has had its value set", 1, o1.myField());
}

{
    var fieldFound;
    var o = new Class1();
    o.myField("unique string 012345");

    // See if we can find a field with a related name or with that value in the object
    for (i in o) {
        if (typeof o[i] == "function") continue;
        if (i.indexOf("myField") != -1 || (typeof o[i] ==...