Здравствуйте, DPP, Вы писали:
На самом деле описанные пример совсем не фишка и даже не ошибка, а вполне закономерные результат.
Сравним со следующим примером, чтобы понять почему произошла описанная ситуация:
<script>
function mycl(x)
{
this.i = [];
this.j = [0];
alert(this.i[0]+','+this.j[0]);
this.i.push(x);
}
var a=new mycl(1);
var b=new mycl(2);
</script>
Данные код создает два объекта a и b с полями i = [], j = [0]. Обращаю внимание что эти
объекты отличаются от объектов в исходном примере. И отличаются они ровно своими полями.
В исходном примере поля i и j создавались на этапе объявления прототипа объекта. Это
значит что сколько бы экземпляров мы не создавали — эти поля изначально будут ссылаться
на одни и те же объекты — массивы. В моем примере мы создаем поля в конструкторе и
следовательно сам прототип ничего не знает об этих полях, хотя они и есть в объектах.
Фактически, исходное объявление класса более корректно, т.к. каждый экземпляр класса будет
точно иметь нужные поля. Но при таком объявлении надо помнить о инициализации полей в
конструкторе, чтобы не получить трудноуловимые ошибки. В моем случае я могу создать,
а могу и не создавать некоторые поля, например в зависимости от параметров конструктора.
Ответ на вопрос, о том кто и как пишет.. Это конечно на любителя, но я пишу так:
function A(x, y, z)
{
this.x = x;
this.y = y;
this.z = z;
}
A.prototype.xy = function()
{
return x * y;
}
A.prototype.yz = function()
{
return y * z;
}
Почему так, а не иначе:
1) Объявление полей в конструкторе позволяет избежать ситуации описанной в исходном примере,
если подобное поведение не является необходимым.
2) Отдельное объявление каждого метода — наверное спорно, но мне кажется так легче читать код,
особенно когда методы большие и их много — сразу понятно чей это метод. И еще один аргумент —
при таком подходе очень легко выдергивать некоторые методы из основного кода и выносить их в
отдельные файлы или дописывать новые методы и подключать их из дополнительных файлов. При этом
весь код, и основной, и в дополнительных файлах выглядит одинаково, что упрощает его чтение.