Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
function classA(container) {
this.container = container;
}
classA.prototype.on = function(eType, handler) {
this.container.addEventListener(eType, handler);
}
classA.prototype.un = function(eType, handler) {
this.container.removeEventListener(eType, handler);
}
classA.prototype.fire = function(eType, data) {
this.container.dispatchEvent(
new CustomEvent(eType, {bubbles : true, cancelable : true, detail : data})
);
}
var A = new classA(document.querySelector("#test"));
A.on("testns:someevent1", function(e){ console.log(e.detail + "") })
A.fire("testns:someevent1", {toString : function(){return "test"}})
function inherit(Child, Parent) {
(Child.prototype = Object.create(Child["superclass"] = Parent.prototype)).constructor = Child;
};
function classB() {
classB.superclass.constructor.apply(this, arguments)
}
inherit(classB, classA);
SuperClass.prototype.method.apply(this, arguments) несколько дольше чем this.superCall(), но мы сделали выбор в пользу скорости (отлаживать, кстати, тоже стало проще, да и переопределять методы класса после его создания, что важно для тестирования).$.extend.не всегда известен точный предок, содержащий такую же функцию. Если цепочка наследования классов составляет хотя бы несколько звеньев, вы запаритесь в голове держать, какая функция в каком предке имплементирована.
var A = _n.Root.extend({
method: function(){
console.log('A.method');
}
});
var B = A.extend({});
var C = B.extend({
method: function(){
B.prototype.method.call(this);
console.log('C.method');
}
});
Однако, ускорение в два раза возможно только. если сама функция выполняет всего пару действий. Если функции крупные, то обертка, которая делает пару присваиваний, будет незаметной. Мне сложно представить задачу, в которой используются простейшие функции, но при этом скорость играет существенную роль.
Neutrino — крошечный js-фреймворк с полноценным наследованием и событиями