Просмотр полной версии : Вопрос по prototype и __proto__
Волгоградец
18.01.2008, 20:14
Здравствуйте! Если у кого есть минутка - помогите разобраться. Часто в скриптах встречаю свойства __proto__ и prototype. В книге Гурского сказано - что использование этих свойств - это ООП в стиле AS 1.0. Т.е. насколько я понял это неактуально в случае AS 2.0, ведь любое наследование можно установить используя ClassTwo extends ClassOne. Получается эти свойства устаревшие и их лучше не использовать? Если не так - то зачем они нужны (если использую AS 2.0), в каких случаях применять?
P.S.: простите за ламерство.
chingachgoog
18.01.2008, 20:43
Тут где-то была тема, в чем различие между AS1 и AS2.
Удивительно, но факт - многие этого не знают.
CrazyFlasher
18.01.2008, 21:00
в принципе они бесполезны и без них легко обойтись
В АС2 без них обойтись невозможно. Можно обойтись без обращений к ним - это да.
prototype.__proto__ - ссылка на родительский класс.
prototype - ссылка на данный класс.
Т.е. у любого созданного вами класса обязательно будут эти свойства.
class MyClass extends MovieClip {
function MyClass(){}
}
var myClassInstance = new MyClass();
trace(MyClass.prototype instanceof MovieClip);
trace(MyClass.prototype.__proto__ instanceof Object);
Смотря для каких целей применяются эти свойства.
Волгоградец
19.01.2008, 12:16
Всем спасибо, помогли.
__etc, в смысле для каких целей? Для написания скриптов! Точнее - для организации наследования.
Точнее - для организации наследования.
Для этих целей применять хаки как-то бессмысленно.
Ну, вот, пример для чего я иногда использую обращение к prototype:
AsBroadcaster.initialize(XMLNode.prototype);
XMLNode.prototype.__appendChild = ASnative(253, 4);
XMLNode.prototype.appendChild = function(xn:XMLNode){
this.broadcastMessage('nodeAdded',xn);
this.__appendChild(xn);
}
XMLNode.prototype.__resolve = function(p){
if(!isNaN(p)){
return this.childNodes[p];
} else if(p.charAt(0)=='#'){
return this.attributes[p.substr(1)];
} else {
var r_xml:XML = new XML();
for(var i:Number=0; i<this.childNodes.length; i++){
if(p==this.childNodes[i].nodeName){
r_xml.appendChild(this.childNodes[i].cloneNode(true));
}
}
if(r_xml.childNodes.length==1){
return r_xml.childNodes[0];
} else if(r_xml.childNodes.length>1){
return r_xml.childNodes;
} else {
return;
}
}
}
var _xml:XML = new XML('<data><someNode attr="1"><someOtherNode/></someNode><someNode attr="2"/></data>');
_xml['addListener'](this);
trace(_xml['data']);
trace(_xml['data']['someNode']);
trace(_xml['data'][0]);
trace(_xml['data'][0]['#attr']);
trace(_xml['data'][1]['#attr']);
trace(_xml['data'][0]['someOtherNode']);
function nodeAdded(xn:XMLNode):Void {
trace('_xml added:\r'+xn+'\rnode\r--------------------');
}
Просто писать свой аналог XMLNode + XML мне лень, да и как-то бесполезно это. Использовать XPath тоже не хочется, т.как очень громоздкий и неудобный. А так вполне пушисто получается =)
*Но я не призываю никого так писать* :D
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.