Классы в Javascript
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 10.04.08 07:58
Оценка:
Привет.

Как я уже успел узнать, классы в 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

Спасибы.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.