Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

40 Наследование в JavaScript (Дмитрий Котеров)
Goto page Previous  1, 2, 3, 4, 5, 6  Next
Author Message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Tue Feb 27, 2007 10:24 am (написано за 1 минуту 14 секунд)
   Post subject:
Reply with quote

А может так?
Code (java): скопировать код в буфер обмена
var ObjA = {};
ObjA.New = function(){
Object (www.google.com/search?q=allinurl%3Aobject+java.sun.com&bntl=1) = {}
for(i in this){
Object (www.google.com/search?q=allinurl%3Aobject+java.sun.com&bntl=1)[i] = this[i];
}
return Object (www.google.com/search?q=allinurl%3Aobject+java.sun.com&bntl=1);
}
ObjA.a = 100;

var ObjB = ObjA.New();
alert(ObjB.a);
Back to top
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Tue Feb 27, 2007 10:37 am (спустя 12 минут; написано за 4 минуты 31 секунду)
   Post subject:
Reply with quote

Zeroglif wrote:
А ветку эту надо бы прикрыть...
Ну вот - сами раскрыли всем "страшную тайну", а теперь значит "прикрыть"? :)
Не получится! :)
Да пребудет с нами великий javascript ("друг всех джедаев")! :)
Back to top
View user's profile Send private message Send e-mail
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Tue Feb 27, 2007 2:40 pm (спустя 4 часа 3 минуты; написано за 1 минуту 17 секунд)
   Post subject:
Reply with quote

У меня следующий вопрос: врядли JavaScript и JScript писались на пустом месте. Может стоит прочесть книги по Prototype based языках? кто какие посоветует?
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Tue Feb 27, 2007 3:36 pm (спустя 56 минут; написано за 2 минуты 29 секунд)
   Post subject:
Reply with quote

Андрей Сумин wrote:
кто какие посоветует?
Не книги, но всё же - Self Bibliography (research.sun.com/self/papers/papers.html).
Back to top
View user's profile Send private message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Fri Mar 02, 2007 11:36 pm (спустя 3 дня 7 часов 59 минут; написано за 4 минуты 15 секунд)
   Post subject:
Reply with quote

Спасибо за ссылки, за комментарии тоже спасибо
2Дмитрий Кóтеров:
 А я бы не брал на работу программиста, я бы взял лучше аналитики - больше пользы

по поводу кода в конце статьи с наблы 40
Я пришел к выводу, что нужно различать два конструктора: конструктор класса и конструктор объекта
Тогда код будет более читабельным: будет сразу видно какой new для чего используется. Например: newClass, newObject
И код функции будет чище: отпадет надобность в переменной preparing
Back to top
View user's profile Send private message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Sun Mar 04, 2007 6:24 am (спустя 1 день 6 часов 47 минут; написано за 11 секунд)
   Post subject:
Reply with quote

Сообщение обновилось forum.dklab.ru/viewtopic.php?p=130415#130415
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sun Mar 04, 2007 10:10 pm (спустя 15 часов 46 минут; написано за 12 минут 15 секунд)
   Post subject:
Reply with quote

Quote:
1) Конструктор - так как Object это пустой объект, то от конструктора не требуется никаких дополнительных действий, поэтому он должен быть пустым:
function(){};
Почему Object пустой объект, есть и свои свойства, есть и наследуемые? Object - это конструктор с точки зрения реализации наследования в ES, со всеми вытекающими.
Quote:
2.а) Прототип - так как Object это самый первый класс в цепи наследования, то он должен иметь пустой прототип
 2.б) Прототип - так как Object не является производным ни от какого класса, то он должен иметь пустой прототип
Факт только в том, что "The value of the internal [[Prototype]] property of the Object prototype object is null" (ES 15.2.4), то есть для нас это "крайний" объект (выше только null), а собственно старшинство классов (несуществующих в ES) не имеет значение (значение имеет цепь прототипов, кто в [[Prototype]]), тот же конструктор Object будучи функцией уже вроде и нельзя назвать не производным....
Quote:
//Function тест №4
...
alert( test1.__proto__.__proto__ == null ); //true //строка 8
Неправда в последней строке, нужен ещё один шаг до null.
Quote:
Сравнивая Function тест №3 и №4 можно заметить разницу в прототипах созданных объектов f.prototype и test1.prototype, f - это класс, а test1 - это объект. Из этого можно сделать выводы, что нужно различать конструктор объекта и конструктор класса. При создании класса дополнительно инициализируется свойство prototype.
Верно по смыслу. В первом случае создаётся Function object, во втором не Function object, а при создании функции всегда создаётся парный ей новый объект, если функция в будущем станет конструировать, этот объект будет первым в цепи прототипов вновь сконструированного объекта (если не затёрли ссылку на него)...
Back to top
View user's profile Send private message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Mon Mar 05, 2007 4:39 pm (спустя 18 часов 28 минут; написано за 15 минут 11 секунд)
   Post subject:
Reply with quote

Zeroglif wrote:
Quote:
1) Конструктор - так как Object это пустой объект, то от конструктора не требуется никаких дополнительных действий, поэтому он должен быть пустым:
function(){};
Почему Object пустой объект, есть и свои свойства, есть и наследуемые? Object - это конструктор с точки зрения реализации наследования в ES, со всеми вытекающими.
Согласен, наверно надо будет как-то перефразировать. Я хотел сказать, что конструктор не должен выполнять никаких дополнительных действий по инициализации переменных, так как объект Object их не имеет (кроме prototype, constructor, которые являются служебными)
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Sat Mar 31, 2007 12:43 am (спустя 25 дней 8 часов 3 минуты; написано за 1 минуту 43 секунды)
   Post subject:
Reply with quote

Кстати, не пугайтесь. В ближайшее время некоторых участников этого топика (и не только) будут приглашать на работу (вначале на собеседование, естественно).
Приходите!
Back to top
View user's profile Send private message Send e-mail
il!
Участник форума



Joined: 20 Aug 2005
Posts: 39
Карма: 3
   поощрить/наказать

Location: Москва

PostPosted: Thu May 17, 2007 8:23 am (спустя 1 месяц 17 дней 7 часов 40 минут; написано за 8 минут 20 секунд)
   Post subject:
Reply with quote

могли бы вы, для полноты, поделиться списком мыслей про prototype и constructor под заголовком
"Я использую для ..." или "Советую всем использовать для ..." или "помогает кодить при ..." или "извратно использовать в ..."

почему-то вот кажеться, что малая документированность темы кроется в степени ее необходимости
Back to top
View user's profile Send private message Send e-mail
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Thu May 17, 2007 10:20 am (спустя 1 час 57 минут; написано за 40 секунд)
   Post subject:
Reply with quote

Я использую постоянно
Вот пример моего ежедневного кода
jsx.ru/hh/Planner/Calendar.js
Back to top
View user's profile Send private message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Fri May 18, 2007 3:18 pm (спустя 1 день 4 часа 58 минут; написано за 1 минуту 33 секунды)
   Post subject:
Reply with quote

Андрей Сумин wrote:
Я использую постоянно
Вот пример моего ежедневного кода
jsx.ru/hh/Planner/Calendar.js
И я использую постоянно, какие же мы молодцы :)))
Back to top
il!
Участник форума



Joined: 20 Aug 2005
Posts: 39
Карма: 3
   поощрить/наказать

Location: Москва

PostPosted: Fri May 18, 2007 3:21 pm (спустя 2 минуты; написано за 1 минуту 6 секунд)
   Post subject:
Reply with quote

Андрей, но всеравно спасибо. Вот еслиб еще сформулировать :(
Back to top
View user's profile Send private message Send e-mail
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Fri May 18, 2007 3:37 pm (спустя 15 минут; написано за 4 минуты 19 секунд)
   Post subject:
Reply with quote

il! wrote:
кажеться, что малая документированность темы кроется в степени ее необходимости
А тема вообще по большому счету простая и для такой простоты документирована более чем достаточно.
Все эти "суперсложные" вещи, что наследование объектов, что замыкания, производятся от элементарных понятий — цепочки объектов и поиска по ней. Запрашивается свойство у объекта, если находится — выдается, не находится запрашивается у следующего объекта цепи.
А все эти конструкторы, это просто технические частности. К сожалению, во всех статьях и объяснениях по этому поводу именно с конструкторов начинают и им уделяют основное внимание. Поэтому с первого раза все кажется сложным и слабо документированным.
Back to top
View user's profile Send private message
il!
Участник форума



Joined: 20 Aug 2005
Posts: 39
Карма: 3
   поощрить/наказать

Location: Москва

PostPosted: Fri May 18, 2007 9:18 pm (спустя 5 часов 40 минут; написано за 2 минуты 58 секунд)
   Post subject:
Reply with quote

Вот список. Пожалуйста помогите, список буду править.

Вводная...
Конструктор1=function(...){...}
function Конструктор2(...){...}
o1 = new Конструктор1(...)
o2 = new Конструктор1(...)

По умолчанию Конструктор1.prototype ссылаеться на экземпляр Object

Понеслась...

С помощью поля prototype у конструктора можно:
  1. После создания объекта или группы объектов от Конструктор1 добавить всем общие открытые методы или поля благодаря неявным ссылкам которые есть у всех экземпляров на объект-прототип конструктора
Конструктор1.prototype.vv = 123 ;
Конструктор1.prototype.vf = function (){...}
и у всех экземпляров созданных ранее и создаваемых в будующем появяться vv и vf
  1.1 Если программист добавит ручками какому-то экземпляру Конструктора1 одноименные поля, то они скроют поля получаемые неявно от объекта-прототипа.
У всех других экземпляров неявные ссылки доступны, а соответственно значения полей остануться неизменны и в случае vv равны 123 :)
  2. Реализовать типо наследование хотя это теже грабли как в пункте 1, но вид сбоку
Конструктор2.prototype = new Конструктор1(v1, v2, v3) ;
// типо прототипом будет экземпляр Конструктора1, а не то что там было ранее (по умолчанию Конструктор2.prototype ссылался на экземпляр Object воще-то)
obj = new Конструктор2(v5, v9) ;
То есть тут мы по неявным ссылкам можем достучаться до открытых полей и методов простого экземпляра Конструктор1
и если ничего не менять в прототипе Конструктор2 все его последующие экземпляры разделят через прототип общий экземпляр Конструктора1 - З А Ш И Б И С Ь
Вывод - хочеш путевое наследование, создавай дополнительный метод который будет дрючить все конструкторы учавствующие в наследовании
function GoblinNah(v1, v2, v3, v5, v9)
{
    Конструктор2.prototype = new Конструктор1(v1, v2, v3) ;
    return new Конструктор2(v5, v9) ;
}
  3. Конструктор1.prototype=null(или любой другой объект) приведет к тому что все последующе созданные объекты от Конструктор1 будут создаваться без мути, которая навешана на его прототип в пункте 1, но !!! все созданные ранее объекты не потеряют неявную ссылку на прежний объект-прототип Конструктора1 и значит сохранят vv и vf
Фишка аднакааа
  4. Добавить поля и методы встроенным объектам
if(Array.prototype.push==null/* ie5 */){Array.prototype.push=function(){var i=this.length,r=0,a=this.push.arguments,n=a.length,k=i+n;for(;i<k;i++,r++){this[i]=a[r];}return this.length;}}
Сами прототипы у встроенных объектов менять незя.


С помощью поля prototype у объекта-экземпляра можно:
  1. А ничего незя. Нет у экземпляров такого поля, но пытливый программист его может создать
obj17.prototype="фигня"


С помощью конструктора как такового можно
  1. Создать экземпляр с доступными полями и методами
  2. Создать приватные (извиняюсь скрытые) поля и методы в экземпляре. Скрытые поля будут свои у каждого экземпляра и будут доступны скрытым и доступным методам


С помощью поля constructor у объекта-экземпляра можно
  1. по неявной ссылке обратиться к конструктору создавшему объект
  2. можно скрыть неявную ссылку заданием явного поля
v1.constructor=4
а можно все вернуть навзад
delete v1.constructor
что позволит опять видеть конструктор создавший объект


С помощью поля constructor у конструктора можно:
  1. Ничего не можно
  2. обращаясь к Конструктор1 мы всегда обращаемся к одному и томуже автоматическому экземпляру конструктора (ну наверное). Типо из нашей строки создали объект функции, а тк он сам от Object, то на него можно навешать дополнительные поля, поэтому делая типа
Конструктор1.constructor = {v:6} ;
добавим одноименное поле constructor чем скроем неявную ссылку на реальный конструктор Function(),
зато потом можем и ее удалить :)
delete Конструктор1.constructor
вернет все на свои места убив явное поле, что откроет опять неявную ссылку на реальный конструктор,


Чего нехватает?
Поделитесь конкретными приемами и фишками. Мне больше практика, а не теория интересна.


Zeroglif - респект, Винграду привет :)
forum.tts.lt/index.php?showtopic=44085 - респект
Back to top
View user's profile Send private message Send e-mail
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat May 19, 2007 6:56 am (спустя 9 часов 38 минут; написано за 13 минут 51 секунду)
   Post subject:
Reply with quote

il! wrote:
Мне больше практика, а не теория интересна.
Ну так написали бы вместо "гоблинских" примеров какие-нибудь "отрывки из практики". Вот тогда было бы на самом деле интересно. А так:
Quote:
obj17.prototype="фигня"
действительно "фигня"...
Г.О. wrote:
А тема вообще по большому счету простая...
Так уж и простая? ;) И давно ли она стала такой простой? В начале прошлого года эту тему никто не считал таковой, а кто считал, тот просчитался. Даже "Моисей", который "вывел нас к земле обетованной", был достаточно осторожен:
Zeroglif wrote:
Расскажу то, как я это себе представляю, не претендуя на истину...
;) Причем он "вывести-то вывел", но до сих пор ему приходится "латать дыры" в моих, например, знаниях - forum.dklab.ru/viewtopic.php?p=134654#134654. Кому было ясно-понятно, что любая функция становится в первую очередь методом объекта, доступного через св-во этой же функции prototype (и метод этот называется constructor), и лишь потом может "впридачу" стать/не стать методом какого-то другого объекта? Вопрос риторический, но замечу (и это видно из ссылки выше), что моя мысль не смогла так "прогнуться и завернуть куда надо" без посторонней помощи. А сколько еще таких "капканов" расставлено на тех, кто считает эту тему простой?..
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Thu May 24, 2007 9:04 pm (спустя 5 дней 14 часов 7 минут)
   Post subject:
Reply with quote

AKS

Вопрос решен, тему можно закрыть.
Back to top
Guest






Карма: 388
   поощрить/наказать


PostPosted: Thu May 24, 2007 9:05 pm (спустя 48 секунд; написано за 17 секунд)
   Post subject:
Reply with quote

ой, че это я сделал) сори
Back to top
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Thu May 24, 2007 10:52 pm (спустя 1 час 47 минут; написано за 17 секунд)
   Post subject:
Reply with quote

Гость
Сейчас мы Вас вообще забаним за то, что мусорите на форуме ;)
Back to top
View user's profile Send private message Send e-mail
il!
Участник форума



Joined: 20 Aug 2005
Posts: 39
Карма: 3
   поощрить/наказать

Location: Москва

PostPosted: Fri May 25, 2007 1:38 am (спустя 2 часа 45 минут; написано за 2 минуты 7 секунд)
   Post subject:
Reply with quote

Под практикой имел ввиду идеи использования, шаблоны. Лучше бы на словах, а не кодом.

Last edited by il! on Fri May 25, 2007 8:11 am; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Fri May 25, 2007 4:55 am (спустя 3 часа 17 минут; написано за 2 минуты 48 секунд)
   Post subject:
Reply with quote

il! wrote:
Не кипятись...
Не-е-е, я и не думал даже. Просто предложил объективно подойти к вопросу. "Маниловщина" - это не интересно...
А "личка" зачем? Здесь в форуме гораздо результативней...
Back to top
View user's profile Send private message Send e-mail
il!
Участник форума



Joined: 20 Aug 2005
Posts: 39
Карма: 3
   поощрить/наказать

Location: Москва

PostPosted: Fri May 25, 2007 8:19 am (спустя 3 часа 24 минуты; написано за 12 минут 38 секунд)
   Post subject:
Reply with quote

Примеры лежат по ссылке из того моего поста внизу.
Back to top
View user's profile Send private message Send e-mail
AlDev
Guest





Карма: 388
   поощрить/наказать


PostPosted: Fri Sep 07, 2007 8:15 am (спустя 3 месяца 12 дней 23 часа 55 минут; написано за 1 минуту 4 секунды)
   Post subject:
Reply with quote

Багрепорт:
Code (any language): скопировать код в буфер обмена
                    var A = newClass(null,{
                        constructor: function() {
                            alert ('A!');
                        }
                    })

                    var B = newClass(A,{
                        constructor: function() {
                            alert ('B!');
                            this.constructor.prototype.constructor.call(this);
                        },

                        testMethod: function() {
                            alert ('йа тестег!');
                        }
                    })

                    var C = newClass(B,{
                        constructor: function() {
                            alert ('C!');
                            this.constructor.prototype.constructor.call(this);
                        },

                        //override testMethod
                        testMethod: function() {
                            this.constructor.prototype.testMethod();
                        }
                    })

                    var t = new C();
                    t.testMethod();
Back to top
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Fri Sep 21, 2007 2:34 pm (спустя 14 дней 6 часов 19 минут; написано за 3 минуты)
   Post subject:
Reply with quote

Может кто знает, но в данной реализации ЯваСкрипта помойму невозможно узнать с какого прототипа вызвана функнция, а также невозможно вызвать функцию с базового прототипа
Если конкретнее, то столкнулся со следующей проблемой
Code (JavaScript): скопировать код в буфер обмена
A.prototype= fn1();
var B= new A();
B.prototype= fn1() {
 /*
 }
var C= new B();

d= new C();

d.fn1();
* код не является рабочим и всего лишь наброска. Надеюсь смысл вопроса будет понятен всем
.
Дмитрий Котеров wrote:
Кстати, не пугайтесь. В ближайшее время некоторых участников этого топика (и не только) будут приглашать на работу (вначале на собеседование, естественно).
Приходите!
Приглашали, пока устраивает и текущая работа...
А можно просто в гости приехать, пообщаться? А?
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Fri Sep 21, 2007 5:10 pm (спустя 2 часа 35 минут; написано за 2 минуты 8 секунд)
   Post subject:
Reply with quote

KES wrote:
код не является рабочим и всего лишь наброска. Надеюсь смысл вопроса будет понятен всем
Смысл чуток улавливается, но уж очень код странный, хоть и не рабочий, что за вызов fn1? B - это конструктор что ли, раз свойство prototype есть? что за функция f1, её вообще нет? Попробуй яснее кодом описать.
Back to top
View user's profile Send private message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Sat Sep 22, 2007 9:47 am (спустя 16 часов 36 минут; написано за 3 минуты 49 секунд)
   Post subject:
Reply with quote

Если говорить нормальным языком ООП, то:
Как вызвать функцию с базового класса?

Сейчас просто есть массив всех конструкторов, плюс добавляю свойство указатель (baseClass) на базовый конструктор и вызов делается как:
function thisFunction() {
  Classes.TThisClass.baseClass.thisFunction.apply( this, arguments );
  //Вот такая конструкция не годится: this.constructor.basaClass.thisFunction.apply( this, arguments );
  }
Back to top
View user's profile Send private message
An6rey
Участник форума



Joined: 30 Aug 2007
Posts: 69
Карма: 3
   поощрить/наказать


PostPosted: Sat Sep 22, 2007 1:39 pm (спустя 3 часа 52 минуты; написано за 18 минут 1 секунду)
   Post subject:
Reply with quote

При реализации классов и наследования в JavaScript обычно идут двумя путями - используют встроенную поддержку наследования в стиле

1) var ChildClass= function(){};
ChildClass.prototype = new ParentClass();

либо реализуют подход основанный на

2) for (var prop in ParentClass.prototype)
   if (typeof(ChildClass.prototype[prop])=="undefined")
       ChildClass.prototype[prop] = ParentClass.prototype[prop];

В конечном итоге при создании развернутой системы классов - проблемой становится загрузка кода всех классов родителей до любого из классов потомков.
В ряде библиотек - dojo, jsolait - подход с использованием Ajax для загрузки кода классов и разрешения этого вопроса.

Второй из подходов (for in) и загрузку кода Ajax я использую в своих утилитах, фрагмент из которых приведен ниже.
Часть кода, который отвечает за вызов методов суперклассы выделен полужирным шрифтом. Думаю, что аналогичный подход можно применить и в Вашем случае.

mod.derive=function(className){
if (this.parentList[className])
    return this;
var self=this;
this.parentList[className]=true;
var arg=[]
for (var i=1;i<arguments.length;i++)
    arg[i-1]=arguments[i]
aovc.js.util.importModule(className)
var classConstructor=eval(className)
mod.isa(this.constructor.prototype,classConstructor.prototype)
mod.isa(this.superClass,classConstructor.prototype)
//this.ISA(this.constructor)
classConstructor.call(this)
if(classConstructor.prototype.init){
    classConstructor.prototype.init.apply(this,arg)
}

for (var method in this.superClass){
    if (typeof(this.superClass[method])=="function")
     void function(/*local*/){
        var method0=method
        var self0=self
        self0.sup[method0]=function(args){
            self0.superClass[method0].apply(self0,arguments);
        }
    }(/*endlocal*/)
}

return this;
}

Last edited by An6rey on Sat Sep 22, 2007 1:49 pm; edited 1 time in total
Back to top
View user's profile Send private message
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Sat Sep 22, 2007 1:47 pm (спустя 8 минут; написано за 1 минуту 7 секунд)
   Post subject:
Reply with quote

Quote:
Если говорить нормальным языком ООП
Это не нормальный язык ООП :)
Это язык классориентированного ООП.
Quote:
При реализации классов и наследования в JavaScript
При реализации "подобия классов", прошу прощения :)
А наследование как таковое с классами не связано
Back to top
View user's profile Send private message
An6rey
Участник форума



Joined: 30 Aug 2007
Posts: 69
Карма: 3
   поощрить/наказать


PostPosted: Sat Sep 22, 2007 1:57 pm (спустя 9 минут; написано за 4 минуты 30 секунд)
   Post subject:
Reply with quote

Г.О. wrote:
При реализации "подобия классов", прошу прощения :)
А наследование как таковое с классами не связано
Относятся ли классы к свойствам языка программировнания - или к способу мышления программиста?
Наверное ответ зависит от точки зрения.
Back to top
View user's profile Send private message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Sat Sep 22, 2007 2:40 pm (спустя 42 минуты; написано за 5 минут 26 секунд)
   Post subject:
Reply with quote

KES wrote:
function thisFunction() {
  Classes.TThisClass.baseClass.thisFunction.apply( this, arguments );
  }
У этого подхода 2 минуса:
1) Нужно держать хеш всех конструкторов
2) При изменении имени класса нужно заменять по всему тексту TThisClass на TNewClass
1-е куда еще ни шло, а вот 2-е --- ОЧЕНЬ, ОЧЕНЬ плохо...
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Sat Sep 22, 2007 2:47 pm (спустя 6 минут; написано за 3 минуты 44 секунды)
   Post subject:
Reply with quote

KES
п.1 ещё хуже, т.к. даёт замедление работы кода в разы, поскольку для каждой точки идёт полное вычисление контекста.
Со всеми вытекающими накладными расходами.
Разработчики движков советуют везде где только можно кешировать подобные длинные вызовы вручную.
Т.е. вместо
Code (JavaScript): скопировать код в буфер обмена
for (var i in p1.p2.p3.p4) {}
предлагают писать
Code (JavaScript): скопировать код в буфер обмена
var p4 = p1.p2.p3.p4;
for (var i in p4) {}
Back to top
View user's profile Send private message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Sat Sep 22, 2007 2:57 pm (спустя 10 минут; написано за 3 минуты 3 секунды)
   Post subject:
Reply with quote

Упрощу задачу:
var A= function(){};
A.prototype.f1= function c1() {...}

var B= new A();
B.f1= function c2() {...};

Как из функции c2 вызвать функцию c1 имея указатель на объект this, arguments и прочуу дребедень которую предоставляет JavaScript
c2 вызывалась как: B1.f1();
Back to top
View user's profile Send private message
An6rey
Участник форума



Joined: 30 Aug 2007
Posts: 69
Карма: 3
   поощрить/наказать


PostPosted: Sat Sep 22, 2007 3:19 pm (спустя 21 минуту; написано за 14 минут 16 секунд)
   Post subject:
Reply with quote

KES wrote:
var A={};
A.prototype.f1= function c1() {...}
var B= new A();
B.f1= function c2() {...};
A - объект. Объект имеет constructor, а не prototype
То есть правильнее написать
var A=function(){};
A.prototype={};
A.prototype.f1= function c1() {...}
var B = new A();
B - экземпляр A - да простит мне Г.О. такое святотатство.
B.f1= function c2() {...};
Функция f1() присоединена к экземпляру B класса A()
Следовательно внутри с2() Вы можете использовать this.constructor.prototype.f1.call(this)
Back to top
View user's profile Send private message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Sat Sep 22, 2007 4:37 pm (спустя 1 час 17 минут; написано за 2 минуты 1 секунду)
   Post subject:
Reply with quote

Quote:
Следовательно внутри с2() Вы можете использовать this.constructor.prototype.f1.call(this)
Совершенно верно. А теперь представьте что А тоже экземпляр XXX
Code (JavaScript): скопировать код в буфер обмена
var XXX= function(){}
XXX.prototype= {};
XXX.prototype.f1= function c0(){...};

var A= new XXX();
A.prototype={};
A.prototype.f1= function c1() {...}

var B = new A();
B.f1= function c2() {...};
Как вызвать функцию c0 с функции c1?
Back to top
View user's profile Send private message
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Sat Sep 22, 2007 5:04 pm (спустя 27 минут; написано за 1 минуту 24 секунды)
   Post subject:
Reply with quote

Имеется ввиду "c0 из c2"?
Если вы строите наследование XXX -> A -> B, то делает это неверно.

нужно:
Code (JavaScript): скопировать код в буфер обмена
A.prototype = new XXX();
В вашем примере A даже не функция.
Back to top
View user's profile Send private message
An6rey
Участник форума



Joined: 30 Aug 2007
Posts: 69
Карма: 3
   поощрить/наказать


PostPosted: Sat Sep 22, 2007 5:13 pm (спустя 8 минут; написано за 12 минут 16 секунд)
   Post subject:
Reply with quote

Я внесу некоторые изменения в Ваш код.
var XXX = function(){}
XXX.prototype= {};
XXX.prototype.f1= function c0(){...};
Пока было без изменений.
var A = function(){}
A - "пустой" "класс"
A.prototype = new XXX();
A - "класс" "наследующий" от ХХХ свойства
A.prototype.f1= function c1() {
   this.constructor.prototype.constructor.prototype.f1.call(this)
}
f1 присоединяем к "экземпляру" XXX

var B = new A();
// присоединять функцию к экземпляру стоит толькло если Вы исполоьзуете замыкание
B.f1= function c2() {
   this.constructor.prototype.constructor.prototype.f1.call(this)
};

Обратите внимание, что в с1 и с2 вызов одинаковый, т.к. в обоих случаях класс один и тот же,
но метод присоединен к проототипу или к экземпляру.
Back to top
View user's profile Send private message
KES
Участник форума



Joined: 19 Oct 2006
Posts: 214
Карма: 0
   поощрить/наказать

Location: сВознесеновка, Мелитопольский р-н, Запорожская обл. Украина

PostPosted: Sat Sep 22, 2007 5:17 pm (спустя 3 минуты; написано за 43 секунды)
   Post subject:
Reply with quote

Г.О. Спасибо за поправку. Совсем уже одичал я =) юзаю спец функцию создания подкласса. И уже потихоньку начал забывать .prototype
Quote:
Имеется ввиду "c0 из c2"?
Имеется ввиду вызов c0 из c1. Смотрите ниже:
Code (JavaScript): скопировать код в буфер обмена
var XXX= function(){}
XXX.prototype= {};
XXX.prototype.f1= function c0(){...};

var A= function(){};
A.prototype= new XXX();
A.prototype.f1= function c1() {
  ??? // aka inherit
  ...
  }

var B = new A();
B.f1= function c2() {
  this.constructor.prototype.f1.call(this); //aka inherit
  ....
  };

B.f1();
c2- вызвали
с1- вызвали
с0- невозможно вызвать/нет решения


2An6rey
Ни я ни мой броузер не поняли вот этот код:
Code (JavaScript): скопировать код в буфер обмена
B.f1= function c2() {
 this.constructor.prototype.constructor.prototype.f1.call(this)
 };
this.constructor.prototype.constructor.prototype.f1 has no properties
[Break on this error] this.constructor.prototype.constructor.prototype.f1.call(this)
Back to top
View user's profile Send private message
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Sat Sep 22, 2007 6:08 pm (спустя 51 минуту; написано за 2 минуты 10 секунд)
   Post subject:
Reply with quote

An6rey, почитайте тему сначала, особенно посты Zeroglif'а.
KES, вот что происходит при попытке скопировать приемы одной парадигмы на другую :). Возможно, вас спасет вызов f1 в контексте прототипа, хотя это зависит от вашей задачи.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat Sep 22, 2007 6:21 pm (спустя 12 минут; написано за 1 минуту 47 секунд)
   Post subject:
Reply with quote

KES wrote:
this.constructor.prototype.constructor.prototype.f1 has no properties
А Вы попробуйте разузнать, кто у Вас на самом деле этот this.constructor.

P.S. Маленькая подсказка: "Истинный конструктор убит".
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sat Sep 22, 2007 6:49 pm (спустя 28 минут; написано за 14 секунд)
   Post subject:
Reply with quote

Code (JavaScript): скопировать код в буфер обмена
var A = function () {};
A.prototype.f1 = function () { alert('c1'); };

var B = new A();
B.f1 = function () { alert('c2'); };

B.f1(); //-> c2
B.constructor.prototype.f1(); //-> c1
//
var temp = B.f1;
delete B.f1;
B.f1(); //-> c1
B.f1 = temp;
B.f1(); //-> c2
 
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page Previous  1, 2, 3, 4, 5, 6  Next
Page 4 of 6    Email to a Friend.
Post a reply
Username
Subject
Господа спамеры и оптимизаторы!

Вы можете даже и не пытаться вставлять в текст поста ссылки - они все равно автоматически удаляются (вернее, тэги <a> заменяются на тэги <u>).

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

Disable BBCode in this post
Disable Smilies in this post
    HTML is OFF
BBCode is ON
Smilies are ON
You cannot post new topics in this forum. You can reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML