PDA

Просмотр полной версии : что создает прототипы?


Whatsername
09.12.2003, 10:55
Love = function (){
};
Love.name="love";
trace (Love.prototype.constructor.name);
//Love.prototype made by Love

Оригинал написал Робин Дебройл

Даже если и прототип не содержит нужных данных, история на этом не заканчивается. Этот самый прототип, являясь полноправным объектом, уж будьте уверены, проверит прототип класса, который создал его - Object. Короче говоря, он проверит Object.prototype...

...Ладно, может вы не в курсе, но в самом деле прототипы создаются классом Object. Точно так же и экземпляры классов (ведь они тоже объекты) слышат в момент своего рождения от родителей: "Если что, посмотри в моем прототипе сынок". Вот так все прототипы и экземпляры в конечном итоге добираются до Object.prototype, если нигде не найдут нужного свойства.
Так что же создает прототипы, класс которому они принадлежат или класс Object?

Nox Noctis
09.12.2003, 12:54
грубо говоря - любой объект создается классом Object

по умолчанию, почти все классы являются дочерними от Object...
а prototype твоего класса - это объект, содержащий то что нужно всем инстансам этого класса

то есть прототип - это всего лишь контейнер, из которого берутся общие свойства и методы... при этом сам этот контейнер создан классом Object

кстати -
есть такое понятие - бесконечная цепочка наследования :)
если сделать так, чтобы прототипом класса был объект этого же класса, и обратиться к любому его свойству - мы получим бесконечную цепочку, на 256 звене которой компилятор склеит ласты :)

Whatsername
09.12.2003, 13:10
при этом сам этот контейнер создан классом Object
Nox Noctis, почему тогда constructor в моем коде обращается не к Object?
Ну вообще-то все понятно, может я мало подумал перед тем как задать этот вопрос... спасибо ;)

Whatsername
09.12.2003, 16:41
а prototype твоего класса - это объект, содержащий то что нужно всем инстансам этого класса
Nox Noctis, а какому классу принадлежит этот прототип если говорить не грубо?

iLoveYou
09.12.2003, 16:58
Оригинал написал(а) dm_nev

Nox Noctis, почему тогда constructor в моем коде обращается не к Object?

дух Нокса через меня говорит, что Love.prototype.constructor есть ссылка на функцию конструктора данного класса.
пример:
Love = function (a){
trace (a);
};
b=Love.prototype.constructor;
b.apply(null, ["constructor called"]);
а так как функции тоже могут иметь свойства то
Love.name="love";
trace (Love.prototype.constructor.name);
выдаст сам знаешь что :)

Whatsername
09.12.2003, 19:16
Угу, спасибо, Сергей, дог.прототип - это ссылка на дог.
Все верно?

llllllllll
09.12.2003, 21:19
Прототипы уже не в моде :)

JScript7

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/jscript7/html/jsconcreatingyourownclasses.asp

JavaScript2

http://www.mozilla.org/js/language/es4/index.html
http://www.mozilla.org/js/language/js20/core/classes.html

или к примеру :)

http://ru3.php.net/manual/ru/ref.classobj.php

Так, что давайте в другой раздел с ActionScript 2.0 :) :) :)

Whatsername
10.12.2003, 10:43
Оу! Спасибо за ссылки llllllllll. Но все по порядку. Я, пожалуй, суперАнтиМодный, но хочу разобраться как работают прототипы.

Nox Noctis
10.12.2003, 12:48
все можно наглядно увидеть прямо в листе переменных...
воспользуемся всем уже известной фишкой:
deprotect = function (o) {
ASSetPropFlags(o, null, 8, 7);
if (typeof (o) == "function") {
ASSetPropFlags(o.prototype, null, 8, 7);
} else {
ASSetPropFlags(o.__proto__, null, 8, 7);
}
};теперь пишем:
//
cavat = function () {
};
cavat.prototype.test = "property of cavat class !";
//
gutta = new cavat();
//
deprotect(Object);
deprotect(gutta);
//
trace(cavat.prototype.__proto__ == Object.prototype);
trace(cavat.__proto__.__proto__ == Object.prototype); запускаем, жмем Ctrl+Alt+V, и видим:
Variable _level0.cavat = [function] {
prototype:[object #3, class 'Object'] {
constructor:[function],
__proto__:[object #4] {
constructor:[function 'Object'] {
prototype:[object #4]
},
watch:[function],
unwatch:[function],
addProperty:[function],
valueOf:[function],
toString:[function],
hasOwnProperty:[function],
isPrototypeOf:[function],
isPropertyEnumerable:[function],
toLocaleString:[function 'toLocaleString']
},
test:"property of cavat class !"
}
}
Variable _level0.gutta = [object #15] {
__proto__:[object #3, class 'Object'],
constructor:[function],
__constructor__:[function]
}ну вооот... :)

в общем виде наследование можно организовывать так:
cls1 = function () {
}
cls2 = function () {
}
cls2.prototype = new cls1()

ultraflasher
10.12.2003, 14:04
Оригинал написал(а) Nox Noctis
а prototype твоего класса - это объект, содержащий то что нужно всем инстансам этого класса


а prototype твоего объекта - это методы, содержащие то что нужно всем инстансам этого объекта (и всем его экземплярам)

если не ощибаюсь...

ultraflasher
10.12.2003, 14:09
Оригинал написал(а) llllllllll
Прототипы уже не в моде :)

JScript7

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/jscript7/html/jsconcreatingyourownclasses.asp

JavaScript2

http://www.mozilla.org/js/language/es4/index.html
http://www.mozilla.org/js/language/js20/core/classes.html

или к примеру :)

http://ru3.php.net/manual/ru/ref.classobj.php

Так, что давайте в другой раздел с ActionScript 2.0 :) :) :)

ага, некотрые из этих ссылог есть прямо в help'e для as2.0 в flash 7

Nox Noctis
10.12.2003, 14:13
Оригинал написал(а) ultraflasher
а prototype твоего объекта - это методы, содержащие то что нужно всем инстансам этого объекта (и всем его экземплярам)

если не ощибаюсь... эээ... у объектов по умолчанию вообще нет свойства prototype. это свойство есть только у функций... если ты функцию используешь как конструктор объекта, то __proto__ этого объекта становится равен prototype этой функции, благодаря чему собсно инстансы и наследуют классовые методы/свойства

вообще я не очень понял твою фразу :))

Whatsername
10.12.2003, 14:51
Ох спасибо, Nox Noctis.
Не очень уверенно я смотрю на такое количество кода, но обязательно постараюсь во всем разобраться. Ты мне говорил уже о чем-то подобном в других топиках. Большое спасибо...