Это чисто вопрос производительности, и мне нет дела до удобства сопровождения или читабельности.
Этот вопрос о том, как наилучшим образом компоновать ООП в ключе c # / c ++ в javascript по отношению к виртуальным и не виртуальным методам.,Проблемы производительности в основном связаны с явной передачей объекта «this» и поиском метода в прототипе по сравнению с массивом.Четыре объекта, которые я имею в виду, предназначены для объекта:
MyObjectvtable = [];
function MyInnerObject() {}
function MyObject() {
this.mNum = 0;
this.mObject = new MyInnerObject();
this.mStr = "hello!";
this.vtable = MyObjectvtable;
}
function VirtualMethod() {
var that = this;
console.log(String(that.mNum) + that.mStr);
};
function NonVirtual(that) {
console.log(String(that.mNum) + that.mStr);
}
MyObject.prototype.VirtualMethod = VirtualMethod;
MyObjectvtable[0] = VirtualMethod;
MyObjectvtable[1] = NonVirtual;
pobj = new MyObject();
Четыре способа вызова метода здесь (VirtualMethod и NonVirtual) кратко используют вызов прототипа, явно передавая pobj в NonVirtual, ища VirtualMethodв таблице поиска и поиска метода в таблице поиска и явной передачи объекта this.
Метод 1 - Виртуальный прототип:
pobj.VirtualMethod();
Метод 2 - Не виртуальный
NonVirtual(pobj);
Метод 3 - vtable-this-bind
pobj.vtable[0].bind(pobj)();
Метод 4 - vtable -licit-bind
pobj.vtable[1](pobj);
Я добавил тестовые сценарии в JSPerf, но они кажутся неокончательными, поскольку Firefox предпочитает метод NonVirtual (может быть самым быстрым, но предполагает доступ к глобальной функции)).
Вот случай JSPerf: https://jsperf.com/virtual-vs-non-virtual-functions