function ViewModel() { this.email = observable(); } // observer // 指定の値を観測して、変化があったらNotifyを送る function observable() { var value; var module = function(newValue) { if(typeof(newValue) === 'undefined') { // getter return value; } else { // setter value = newValue; module.valueChanged(); } }; module.valueChanged = function() { // subscriberに通知 module.subscriber(value); }; return module; } // ViewModelとDOMをバインドする function bindViewModel(vm) { // vmのemailがpropertyNameとして受け取れる var propertyNames = Object.getOwnPropertyNames(vm); propertyNames.forEach(function(propertyName) { // viewというか観測対象のcomponentかな。。。 var view = document.getElementById(propertyNames); var property = vm[propertyNames]; // ViewModel -> View property.subscriber = function(newValue) { view.value = newValue; }; // View -> ViewModel view.addEventListener('input', function(e) { property(e.target.value); }); }); } var vm = new ViewModel(); bindViewModel(vm); vm.email('mitsuru.ogawa.jp@gmail.com');