Overview
Implement a Model class:
get(attr)— returns attribute valueset(attr, value)— sets attribute and emitschange:attrif differenton(event, handler)— listen for eventsoff(event, handler)— remove listener
Examples
const m = new Model({ name: 'Alice' });
m.on('change:name', (val) => console.log(val));
m.set('name', 'Bob'); // logs 'Bob'
m.get('name'); // 'Bob'Solution
Reveal solution
class Model {
constructor(attrs = {}) {
this._attrs = { ...attrs };
this._events = {};
}
get(attr) { return this._attrs[attr]; }
set(attr, value) {
const old = this._attrs[attr];
this._attrs[attr] = value;
if (old !== value) {
const handlers = this._events['change:' + attr] || [];
handlers.forEach(h => h(value, old));
}
}
on(event, handler) {
if (!this._events[event]) this._events[event] = [];
this._events[event].push(handler);
}
off(event, handler) {
if (this._events[event]) this._events[event] = this._events[event].filter(h => h !== handler);
}
}backbone-model.js
Backbone Model
hardcodingJavaScriptClasses
Overview
Implement a Model class:
get(attr)— returns attribute valueset(attr, value)— sets attribute and emitschange:attrif differenton(event, handler)— listen for eventsoff(event, handler)— remove listener
Examples
const m = new Model({ name: 'Alice' });
m.on('change:name', (val) => console.log(val));
m.set('name', 'Bob'); // logs 'Bob'
m.get('name'); // 'Bob'Solution
Reveal solution
class Model {
constructor(attrs = {}) {
this._attrs = { ...attrs };
this._events = {};
}
get(attr) { return this._attrs[attr]; }
set(attr, value) {
const old = this._attrs[attr];
this._attrs[attr] = value;
if (old !== value) {
const handlers = this._events['change:' + attr] || [];
handlers.forEach(h => h(value, old));
}
}
on(event, handler) {
if (!this._events[event]) this._events[event] = [];
this._events[event].push(handler);
}
off(event, handler) {
if (this._events[event]) this._events[event] = this._events[event].filter(h => h !== handler);
}
}NameTopicDifficulty
103 of 103 problems