PDA

Просмотр полной версии : Опять этот Prototype, блин...


Lego
06.05.2004, 11:17
А в чем разница все-таки? (prototype)
Что-то как в той песне - все путанно и непонятно. И ВСЕ-ТАКИ, ДЛЯ ЧЕГО НУЖЕН prototype??? Читаю про классы. Везде приводят подобный пример:



function MyClass(xx, yy)
{
this.x = xx;
this.y = yy;
}
MyClass.prototype.z = 3;

cl = new MyClass(1, 2);

Пишут - prototype для объявления свойства в классе. Ok. А чем x и y не свойства? И чем выше приведенный код будет отличаться от следующего:


function MyClass(xx, yy)
{
this.x = xx;
this.y = yy;
this.z = 3;
}

cl = new MyClass(1, 2);

Или при использование prototype - это подобие защищенных переменных типа protected? Короче, что-то совсем туго...
Большое спасибо.

Nox Noctis
06.05.2004, 11:33
наличие глаз, их положение на теле и их количество - это свойства класса. они хранятся в прототипе.

цвет глаз, размер глаз, их выражение, длина и цвет ресниц - это перснальные свойства экземпляра, они задаются в конструкторе.

идея понятна? :)

прототип также нужен для организации наследования классов.

Whatsername
06.05.2004, 11:44
Ну да, prototype - это родовой объект, все (статичные) свойства которого наследуются экземплярами класса.
При задании свойства в прототипе не происходит копирования этого свойства в каждый экземпляр. Все экземпляры просто получают ссылку на это статичное свойство. Ключевое слово здесь - наследование.

Твой второй пример экономит память, используя принцип наследования.

Кстати, каждый экземпляр имеет свойство _proto, которое указывает на прототип класса (Class.prototype).

В статьях Дебройла есть много чего интересного по теме, посмотри на http://www.vmstudio.com/

Но я надеюсь, что Nox еще чего-нить напишет в этом топике, тогда ты точно вникнешь : )

Lego
06.05.2004, 11:56
Теоретически - все понятно. Теперь нужно на практике убедиться в исключительной необходимости prototype.
Прочто не очень понятно по поводу статичности. Ведь и в первом и во втором случае я могу написать

cl.z = 100;
trace(cl.z);

ведь 100 и выведет. В чем тогда статичность?

Nox Noctis
06.05.2004, 12:04
не надо зацикливаться на слове "прототип".

прототип - это шаблон. трафарет, по которому делаются новые "болванки" под экземпляры. а после создания эту "болванку" можно заполнить чем угодно.

при этом всё что необходимо любому и каждому представителю класса можно создать и разместить в памяти всего один раз, а потом пользоваться всеми свойствами и методами прототипа так, как будто они принадлежат самому объекту.
Оригинал написал(а) dm_nev
Кстати, каждый экземпляр имеет свойство _proto, которое указывает на прототип класса (Class.prototype).
__proto__

Whatsername
06.05.2004, 12:05
статичность и в том и в другом случае.
Доверять создание свойств классу (без прототипа) стоит лишь когда ты передаешь значение в качестве параметра класса.

function MyClass(xx, yy)
{
this.x = xx; // динамически задаваемые свойства
this.y = yy; // the same, зеленые глаза, например
}
MyClass.prototype.z = 3; // статичное свойства
// глаза у всех на лице, зачем их вешать на затылок??

cl = new MyClass(1, 2);

Для задания методов класса тоже чаще всего используется прототип класса. Методы способны обрабатывать ДИНАМИЧЕСКИЕ свойства и возвращать результат, а вот копировать их в каждый экземпляр нет необходимости, даже вредно иногда.
------------
__proto__ ой, мля, тока

Lego
06.05.2004, 12:11
Огромное спасибо.
Пошел осозновать все вышеизложенное. :D