var assert = function (exp, msg) {
var el = console.log.el || (console.log.el = $('#console'));
el.append(_.template('<div<%=cls%>><%-msg%></div>')({
cls: exp ? '' : ' class="fail"',
msg: msg
}));
};
var Person = Backbone.Model.extend({
defaults: {
name: 'John Doe',
age: 25
}
});
var Person2 = Backbone.Model.extend({
defaults: function () {
return {
name: 'John Doe',
age: 20 + Math.floor(Math.random() * 30)
};
}
});
var SuperMan = Person.extend({
defaults: {
power: 530000
}
});
var SuperMan2 = Person.extend({
defaults: function () {
return _.defaults({
power: 530000
}, _.result(Person.prototype, 'defaults'));
},
say: function () {}
});
var person = new Person({ age: 100 });
assert('John Doe' === person.get('name'), 'name はデフォルト値がセットされている');
assert(100 === person.get('age'), 'age はインスタンス化時の値がセットされている');
assert(true, '-----');
var person2 = new Person2({ name: 'Jane Doe' });
assert('Jane Doe' === person2.get('name'), 'name はインスタンス化時の値がセットされている');
assert(20 <= person2.get('age') && person2.get('age') < 50, '年齢はデフォルト関数から正常にセットされている');
assert(true, '-----');
var superMan = new SuperMan();
assert('John Doe' === superMan.get('name'), 'name は Person から継承した値がセットされている');
assert(530000 === superMan.get('power'), 'power は正常にセットされている');
assert(true, '-----');
var superMan2 = new SuperMan2();
assert('John Doe' === superMan2.get('name'), 'name は Person から継承した値がセットされている');
assert(530000 === superMan2.get('power'), 'power は正常にセットされている');
<div id="console"></div>
#console {
padding:.5em;
border:1px solid #ccc;
overflow:auto;
height:200px;
.fail {
color: red;
text-decoration: line-through;
}
}
External resources loaded into this fiddle: