JSFiddle - React, Tailwind, and code Playground

by Raynos

HTML

<script src="http://documentcloud.github.com/underscore/underscore.js"></script>

JavaScript

var Constructor = function() {
    var data = 4;
    var foobaz = 5;

    this.o = 5;

    this.getData = function() {
        return data;
    };

    this.setData = function(val) {
        data = val;
    };

    this.count = function() {
        return foobaz++;
    };

    this.getO = function() {
        return o;
    };

};

Constructor.prototype.p = function() { 
    this.setData(this.getData() + 1);
    return this.getData()
};

var readOnly = function(obj, publicData) {
    var object = new obj.constructor;
    _.each(object, function(val, key) {
        delete object[key];    
    });
    _.each(obj.constructor.prototype, function(val, key) {
        object[key] = undefined;
        if (_.isFunction(val)) {
            _.bindAll(obj, [key]);
        }
    });
    _.bindAll(obj, _.functions(obj));
    _.each(publicData, function(val) {
        object[val] = obj[val];    
    });
    return object;
};

var c = new Constructor();
var o = readOnly(c, ["getData", "count", "getO", "p"]);
o.p();
console.log(o.p());
console.log(c.p());