Привет.
Как я уже успел узнать, классы в js можно эмулировать кучей различных способов, один извращённее другого.
1.
function MyClass() {
this.field1 = 666;
this.method1 = MyClass_method1();
this.method2 = MyClass_method2();
// ...
}
function MyClass_method1(x) {
alert("MyClass_method1");
}
function MyClass_method2(x) {
alert("MyClass_method2");
}
Каждый раз перенабирать имя класса в имени "метода" наводит грусть. "Методы" болтаются отдельно. И почему используется NewClass_method1() вместо NewClass_method1 в конструкторе? В конце концов в javascript функции FCO или не FCO?
2.
function MyClass() {
this.field1 = 666;
}
MyClass.prototype.method1 = function(x) {
alert("MyClass_method1");
}
MyClass.prototype.method2 = function(x) {
alert("MyClass_method2");
}
Уже лучше, но раздражает слово prototype. И имя класса каждый раз нужно снова повторять. И методы опять как-то нехорошо отделены от класса.
3.
function MyClass() {
this.field1 = 666;
MyClass.prototype.method1 = function(x) {
alert("MyClass_method1");
}
MyClass.prototype.method2 = function(x) {
alert("MyClass_method2");
}
}
Одним недостатком меньше — код компактен, но попугайское повторение одного и того-же имени класса и слова prototype портят весь кайф.
4.
function MyClass() {
this.field1 = 666;
this.method1 = function(x) {
alert("MyClass_method1");
}
this.method2 = function(x) {
alert("MyClass_method2");
}
}
Самый чистый и опрятный вариант, но и тут оказываются грабли. Оказывается, мегадвижки не в состоянии соптимизировать код и прям-таки вынуждены плодить по новой функции на каждый экземпляр. Ужос, просто.
В связи с этим у меня 4 вопроса:
1. Функции в javascript первоклассные или нет?
1. Какой способ определения класса выбирают РСДН-гуру?
2. Почему оптимизация в пункте 4 невозможна? Что мешает?
3. Насколько скорость вызова метода определённого как MyClass.prototype.method1 отличается от метода, определённого как this.method2
Спасибы.