Re: [JS] левые кросс-объектные поля (а-ля static var в класс
От: Alexey Shtokalo Россия http://alexey.shtokalo.net
Дата: 22.11.06 07:59
Оценка: 3 (2)
Здравствуйте, 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) Отдельное объявление каждого метода — наверное спорно, но мне кажется так легче читать код,
особенно когда методы большие и их много — сразу понятно чей это метод. И еще один аргумент —
при таком подходе очень легко выдергивать некоторые методы из основного кода и выносить их в
отдельные файлы или дописывать новые методы и подключать их из дополнительных файлов. При этом
весь код, и основной, и в дополнительных файлах выглядит одинаково, что упрощает его чтение.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.