Наследование в CanJS

Для начала скажу что CanJs, это форк от JavaScriptMVC, который был разобрал вот тут.

Так вот, разбирая наследование контроллеров во фреймворке, не сразу поняли как оно работает. Пример в официальной документации был не очевиден, а гугление не дало быстрого ответа.

Все конечно же оказалось просто, но дошли мы к этому не сразу. Надеюсь этот посто облегчит жизнь тем, кто столкнется с аналогичным вопросом.

Итак, пример. Для начала создадим родительский класс, с методом, который уначледуется, и свойством, которое будет переопределено:

var Parent = can.Control({
    name:'parent',
    showName: function(){ alert(this.name) }
})

Теперь внимание – дочерний класс мы создаем уже не через can.Control, через уже существующий класс Parent:

var Child = Parent({
    param:'child'
})

Теперь создадим объекты и вызовем в каждом из них наш метод:

var parent = new Parent('#parent');
var child = new Child('#child');
parent.showName();
child.showName();

Поддерживается цепочное наследование, т.е. мы дальше можем получать наслдеников от Child:

var SubChild = Child({
    param:'subchild'
})

События, а точнее обработчики событий, тоже наследуются. Что изначально было подвергнуто сомнению.

Итоговый код:

var Parent = can.Control({
    param:'parent',
    showName: function(){ alert(this.param) },
    'click': function(){ this.showName() }
})

var Child = Parent({
    param:'child',
})

var SubChild = Child({
    param:'subchild',
})

var parent = new Parent('#parent');
var child = new Child('#child');
var subchild = new SubChild('#subchild');

Поиграться с ним можно вот тут.