/* * * UUID * */ // Create GUID / UUID in JavaScript? // https://stackoverflow.com/a/2117523 муром.uuid = function() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace( /[xy]/g, function(c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); } ); }; /* * * Уведомитель / Reporter * */ // ReporterSubscription class. function ReporterSubscription(id, callback, reporter) { this.id = id; this.callback = callback; this.reporter = reporter; } // Reporter class. function Reporter(name) { this.name = (typeof name !== "undefined") ? name : ""; this.subscriptions = []; } Reporter.prototype.report = function() { for (var id in this.subscriptions) { var subscription = this.subscriptions[id]; subscription.callback(); } } Reporter.prototype.subscribe = function(callback) { var id = murom.uuid(); var subscription = new ReporterSubscription(id, callback, this); this.subscriptions.push(subscription); return subscription; } Reporter.prototype.subscribeMany = function(funcs) { for (var i = 0; i < funcs.length; ++i) { var func = funcs[i]; this.subscribe(func); } } var Уведомитель = Reporter; Reporter.prototype.уведомить = function() { this.report(); }; Reporter.prototype.подписать = function(функция) { this.subscribe(функция); }; Reporter.prototype.подписатьМного = function(funcs) { this.subscribeMany(funcs); }; /* * * Пуск / Start * */ муром.пуск = new Уведомитель(); // Can also be accessed as 'murom.run'. Object.defineProperty(murom, "run", { get: function() { return муром.пуск; } }); murom.start = function() { муром.пуск.уведомить(); };