objects passed by reference

by John Allan

HTML

<div id="display"></div>

CSS

body {
    font-family: 'Times New Roman'
}

JavaScript

function log () {
    var html, args;
    args = Array.prototype.slice.call(arguments).join(' ');
    html = $(['<div>', args, '</div>'].join(''));
    $('#display').append(html);
}

viewModel = (function () {
    var module;
    
    module = {};    
    
    var view = {
        'str': 'foo',
        'arr': ['bar', 'baz'],
        'obj': {
            'str': 'foo'
        }
    };
    
    module.getView = function () {
        return view;
    };
    
    module.getProperty = function (name) {
        return view[name];
    };
    
    return module;
    
}());

log('a string object property is passed by value');
var s;
log('get property str as s | ', viewModel.getProperty('str'));
log('set s to \'oof\'');
s = viewModel.getProperty('str');
s = 'oof';
log('property str is still | ', viewModel.getProperty('str'));

log('<br>');

log('an object is passed by reference');
var view;
log('get whole view object');
log('set view.str = oof');
view = viewModel.getView('str');
view.str = 'oof';
log('get property str is now | ', viewModel.getProperty('str'));

log('<br>');

var obj;
log('a object property which is an object is passed by reference');
log(viewModel.getProperty('obj').str);
obj = viewModel.getProperty('obj');
log("obj.str = 'oof';");
obj.str = 'oof';
log('object now contains ', viewModel.getProperty('obj').str);

log('<br>');

var childObj;
log('you cannot replace an entire child object because the object would be different');
log('obj.str is ', viewModel.getProperty('obj').str);
childObj = viewModel.getProperty('obj');
log("childObj = {'str': 'baz'};");
childObj = {'str': 'baz'};
log('object remains as ', viewModel.getProperty('obj').str);

log('<br>');

log(viewModel.getProperty('arr'));