Объект внутри прототипа
Подскажите, как красивее всего создавать объекты внутри прототипа. Например, есть:
function TObject(){} TObject.prototype.do = function(){} var newObject = new TObject; Тут все хорошо, у объекта Object есть метод "do", и обращается к нему через newObject.do(); Что делать когда нужно опустится на уровень ниже и получить обращение к объекту типа такого: newObject.run.something(); Если его описать не как функцию, а как объект, TObject.prototype.run = {} TObject.prototype.run.something = function(){}он будет висеть в прототипе, но не пересоздаваться при вызове "new", и нужно руками делать копию. Подскажите, пожалуйста, правильный вариант. |
Правильный вариант зависит от задачи, которую не понять.
Если на каждый экземпляр TObject нужен отдельный экземпляр run, то, очевидно, его нужно создавать в конструкторе TObject. |
в прототип пихают только то что одинаковое для всех сущностей класса, в конструктор же пихают уникальное. конец.
function Cat() { this.name = 'Ашот' } Cat.prototype.say = function(){ alert(this.name) }; все коты умеют говорить, но имя у всех разное. п.с. а ОБЩЕЕ для всех сущностей пихают в конструктор =) и называется это статическое свойство function Cat() { Cat.count++; } Cat.count = 0; и в Cat.count у нас всегда будет лежать количество созданных котов =) например. сount - статическое свойство |
vasa_c,
Вы правильно поняли, но, я не совсем понимаю как это правильно описать? Делать отдельный объект? - Нет, но как описать его частью TObject, и правильно создать внутри конструктора? |
Maxmaxmaximus3, спасибо, но случай указанный вами я описал в самом начале. Мне интересно, как красиво создать объект со своими методами уже внутри другого объекта, так что бы он оставался частью родителя.
|
StSpirit, это бред, и красиво сделать бред у тебя вряд ли получится. Я понмиаю что ты ХОЧЕШЬ сделать так. Но ХОЧЕШЬ ты так потому что ты плохо программируешь, и надо ПЕРЕСТАВАТЬ так хотеть программировать прежде всего. Это я и пытаюсь донести, не забывай что у того что ты делаешь именно так и у того что ты ВООБЩЕ программируешь - ЕСТЬ ЦЕЛЬ. Само программирование лишь средство а не сама цель. Ты используешь плохо это средство. Обьяснить почему?
Цитата:
|
Maxmaxmaximus3, спасибо за столь подробный комментарий.
Вопрос был таков: Есть дом, у него парадная дверь, она имеет створки, створки двери имеют свои методы отрытия/закрытия, каждая дверь хочет быть частью дома со своими параметрами, а не массивом дверей. Домов много. Так понятнее? |
В таком случае дверь это обьект сервер а дом это объект клиент?
Должны ли двери сами себя открывать или дом или должен управлять? Должны ли двери знать что-то о доме? Короче суть в том что когда связи "один к многим" и эти "много" должны знать что-то об "одном" и он должен знать что-то о них, то обычные программисты новички просто сохраняют в каждом экземпляре двери ссылку на дом, а в доме создают массив дверей. Но это ужастное архитектурное решение и называется "спагетти стайл" =) так как связь между компонентами тесная, а должна быть как можно слабже, двери не должны ничего знать о доме а, дом о дверях. У дверей должен быть интерфейс, и у дома интерфейс. Дом должен создавать массив в который кладутся двери. Двери не должны ничего знать о доме и о том где они лежат. И они должны иметь методы за которые дом мог бы ими управлять а эти методы что-то возвращать, возможно, интересное для дома. И я совершенно не понимаю при чем тут вообще прототип? Ты в курсе что прототип ВООБЩЕ не используется по уму? Люди пихают в прототип разные методы просто чтобы память не жралась и все, это ФИШКА такая, ТРЮК! Сам яваскрипт не так задуман! по уму надо все пилить в конструктор function Cat(){ this.say = function(){} this.name = '' } и вообще что за двери и дом? ты вот про это? function Home() { this.doors = []; this.openDoors = function() { this.doors.forEach(function(door) {door.open()}); } } function Door() { this.open = function() {}; this.close = function() {}; } |
Maxmaxmaximus3, и дом и двери, всё клиент.
Спасибо, судя по вашим высказываниям вы предлагаете методы подобъекта описать внутри конструктора. Мне такой подход не очень нравился, поэтому и спрашивал, хотелось описать снаружи, но, похоже самый действенный вариант - принимаю. P.S. Прототип как раз использую потому как очень много данных (десятки мегабайт в разные "дома") нужно подгружать и контролировать этот процесс. |
Ну я тебе показал как контролируется это
function Home() { this.doors = []; this.openDoors = function() { this.doors.forEach(function(door) {door.open()}); } } function Door() { this.open = function() {}; this.close = function() {}; } у дверей есть методы для работы с ихними данными, а дом их подгружает и распихивает по дверям. и вообще: ЧО ТЫ БЛЯТЬ НЕСЕШЬ????? как ВООБЩЕ связана наша тема разговора с ПРОТОТИПАМИ И НАСЛЕДОВАНИЕМ ????????????????????? мы тут смотрим как архитектуру сделать, при чем тут прототип???????? короче суть, методы запихиваешь в прототип, НЕ МЕТОДЫ запихиваешь НЕ В ПРОТОТИП, все это точка. и это ВООБЩЕ ни как не связано с тем о чем мы говорим. ТЫ ПОНЯЛ ЭТО? ПОВТОРЯЙ: скажи "Архитектурный вопрос совершенно не связан с прототипами", а потом мы продолжим.. тя просто ляпнул хуйню типа "а ну ок, тогда все буду пихать в конструктор" ИЗ МОИХ СЛОВ ВООБЩЕ ТАКОЕ НЕ ИСХОДИТ. окей давай начнем все с чистого листа: что ты хочешь сделать? спроси и я подскажу как. |
Итак поехали заного, твой вопрос не связан с протоитпами вообще. С этим пока все понятно? Если да, то я продолжу.
и вообще,пиши мне вконтакте https://vk.com/max_max_maximus Цитата:
яяяяяя, писааал, тупой ты мой друг, методы внутри конструктора ЛИШЬ ДЛЯ ТОГООООО чтобы показать что ПРОТОТИП ВООБЩЕ НЕ ПРИ ЧЕММ И МОЖНО ПРОГРАММИРОАВТЬ БЕЗ НЕГО, Я ПИСАЛ ИХ ТАМ ТООООЛЬКО ДОЯ ЭТОГОООО, ТОЛОЛЛКОТ И ТООООЛЬКО ТОЛЬКО И ТОООЛКЛТО ИТОЛЬКО И НЕЕ ДЛЯ ЧЕГО ДРУГООГООО, Я МЕЖДУ ПРОЧИМ ДОПОГЛАЗЫЙ ТЫ ПМОЙ УЕБОК ТАК И СКАЗА1!! Я ДАААААААААААААЛ ПОЯТЬ ДЛЯ ЧЕГО Я ПИШУ ИХ НЕ В ПРОТОТИПЕ1111 ТЫ ПРОСТО ТУПИЦА КАКИХ СВЕТ НЕВИДОВАЛ ИДИ НАХУЙ МРАХЗИНА Е БНАНЯ1 |
мне полегчало, можем продолжать, итак поехали заного, раз у тебя есть много обьектов и у них есть что-то общее то зачем ты хочешь засунуть это общее в прототип? а я скажу зачем! потому что ты не умеешь программировать и не знаешь что такое прототип. но я помогу тебе: НЕ НАДО ТАК. помог? отлично, если у тебя есть дом и двери? то двери это НЕЕ сущности а дом это НЕЕЕ прототип.. и ДВЕРИ и ДОМ это 2 разные сущности сука! так что создаватй под каждую сущность свой класс как я показалд выше, и у них клиент серверные отношения, двери это сервера а дом это клиент.
|
короче Здравствуйте!
Судя по вашему сообщению, вы ну совсем не знаете javascript. Освойте основы языка и вопрос отпадет сам, полностью или частично. А с чем не справитесь - поможем. На сайте javascript можно начать изучать с учебника, раздел Основы javascript. Возможно, вам также понадобится HTML - учебник есть, например, здесь: http://ru.html.net/tutorials/html/ Задавайте конкретные вопросы по ходу дела. |
фпизду ни когда больше не зайду в этот раздел с тупицами
|
долбоеб блять, пишу ему сука одно а он мне "аааа, как я понял надо все пихать в конструктор???" БЛЯЯЯТЬ УБЕЙСЯ ПРИДУРОК УБЕЙСЯ1111 ТЫ НЕ ПОНМИАЕШЬ ЗНАЧЕНИЯ БУКОВ!!1 ОНИ СОЧИТАЮТ СЛОВА А ОИ СОЧИТАЮТ ПРЕДЛОЖЕНИЯ А NT ОБЬЕДИНЯЮТСЯ В МЫСЛИ СУКА!11 ТЫ НЕ УМЕЕШЬ РАСШИФРОВЫВАТЬ БУКВОПОСЛЕДОВАТЕЛЬНОСТЬ В МЫСЛИ!1111 ТУПИЦА КАК ТЫ ВООБЩЕВ ОБЩЕСТВЕ ВЫЖИВАЕШЬ!11
|
ПРОТОТИП это И ЕСТЬ ВСЕ ДВЕРИ БЮЛЯТЬ
ПРОТОТИП ЭТО И ЕСТЬ ДВЕРИ СУКА!!1 ПРОТОТИП ====== ДВЕРЬ!! ПРОТОТИП ЭТО НЕ ДОМ СУКА!! ДОМ НЕ МОЖЕТ ЯВЛЯТЬСЯ ПРОТОТИПОМ ДВЕРЕЙ!! ДОМ ЭТО НОВЫЙ КЛАСС БЛЯТЬ!!1 |
В АНУС СЕБЕ МЕГАБАЙТЫ ДАННЫХ ПОДГРУХЗИ ПРИДУРОК!1 ТЕБЕ НЕ СТАТЬ ПРОГРАММИСТОМ КАК Я 1!1 НИКОГДА!1
|
Maxmaxmaximus3,
предыдущий ваш ответ был содержателен, этот уже переходит всякие рамки. Спасибо, более в ваших советах не нуждаюсь. P.S. Ваш коммент намбер раз: Цитата:
Цитата:
|
ПОКА БЛЯТЬ НЕ НАУЧИШЬСЯ БУКВОПОСЛЕДОВАЕТЕЛЬНОСТЬ В МЫСЛИ РАСШИФРОВЫВАТЬ!111 ЕЩЕ ВОПРОСЫ ЕСТЬ???????????????????????????????????????
|
АА, КОНЕНЧО ЕСТЬ, ТЫ ЖЕ ТУПОООЙ!!! НАДО ЖЕ БЛЯТЬ ЧЕТВЕРТЫЙ СУКА РАЗ ПРО ДЖВЕРИ НАПИСАТ И ПРИМЕР СКИНУТИь!1111111
function Home() { this.doors = []; this.openDoors = function() { this.doors.forEach(function(door) {door.open()}); } } function Door() { this.open = function() {}; this.close = function() {}; } function Home() { this.doors = []; this.openDoors = function() { this.doors.forEach(function(door) {door.open()}); } } function Door() { this.open = function() {}; this.close = function() {}; } function Home() { this.doors = []; this.openDoors = function() { this.doors.forEach(function(door) {door.open()}); } } function Door() { this.open = function() {}; this.close = function() {}; } function Home() { this.doors = []; this.openDoors = function() { this.doors.forEach(function(door) {door.open()}); } } function Door() { this.open = function() {}; this.close = function() {}; } function Home() { this.doors = []; this.openDoors = function() { this.doors.forEach(function(door) {door.open()}); } } function Door() { this.open = function() {}; this.close = function() {}; } function Home() { this.doors = []; this.openDoors = function() { this.doors.forEach(function(door) {door.open()}); } } function Door() { this.open = function() {}; this.close = function() {}; } function Home() { this.doors = []; this.openDoors = function() { this.doors.forEach(function(door) {door.open()}); } } function Door() { this.open = function() {}; this.close = function() {}; } |
НЕЛЬЗЯ ДОМ ПИХАТЬ В ПРОТОТИП ДВЕРЕЙ!!!!!!!!!!!
ПОТОМУ ЧТО ПРОТОРИПОМ ДВЕРЕЙ ДОЛЖНА БЫТЬ ДВЕРЬ ТОЛЬКО ДРУГАЯ!!1!!1111 ДВЕРИ НЕ НАСЛЕДУЮТ ОТ ДОМА БЛЯТЬ!!! ДВЕРИ ЭТО НЕ ИЗМЕНЕННЫЕ ВЕРИСИИ ДОМА!!1 /\\\ КАК ВООБШЩЕ АРХИТЕКТУРНЫЙ ВОПРОС БЛЯТЬ СВЯЗАН С НАСЛЕДОВАНИЕМ???????????????????????? ????????????? У МЕНЯ БЛЯТЬ КРЫША ЕДЕТ С ТВОЕЙ ТУПОСТИ |
ушел в баню
|
У вас истерика, но это излечимо, я надеюсь
|
да забей, я просто расстроился что ты путаешь прототип и хуй пойми что)
теперь то понял как надо делать)? есть у тебя есть двери и дом, но дом это не прототип дверей, а отдельная сущность =) все просто я просто злился от того что не мог понять хуиту которую ты несешь, щас понял что ты просто дом пихал в прототип) и мне сразу полегчало. теперь то понял как надо делать)? |
Короче дай ка мне пример своего кода и я переделаю как надо
|
Maxmaxmaximus3, offtopic: Я сожалею что мы говорим на разных языках. Свой вопрос я описал максимально точно, и хотел получить ответ не о своих умственных возможностях, а о возможностях языка описывать под-классы. Я надеялся что есть более красивые методы, кроме тех что ты, чм№;%№;%о, перечисло.
P.S. Давать 90к кода не вижу смысла. |
Я так понял автор топика говорит о "композиции", т.е. когда один инстанс является свойством другого. Довольно частая и тривиальная задача, в общем случае нужно просто создавать новый инстанс-свойство внутри конструктора основного инстанса.
function Base() { this.sub = new Sub(); } Base.prorotype.sub = null; function Sub() { } Желание скрыть явное определение свойства в конструкторе мне кажется странным, но это конечно можно сделать через всякие враперы, но зачем? Код должен быть очевидным и понятным, а каждая ложка "магии" только запутывает общую картинку. |
kobezzza, эм.... вот тебя не бесит от что мы должны "КАЖЕТСЯ ПЫТАТЬСЯ" понять..? у меня бомбануло ядерно от того что человек не верно использует и термины и вообще не понмиет сути.
|
Цитата:
|
у меня так бомбануло в тот момент когда он написал "исходя из ваших слов методы надо писать в конструкторе и тогда, архитектурная проблема решится?" ох у меня бомбануло. я там вообще не писал что методы надо в конструкторе писать, а лишь привел пример как можно программировать обьясняя что прототип не при чем и не связан с нашим вопросом, но он тупой и увидел те куски кода ПРОИГНОРИРОВАЛ ТЕКСТ который следовал ВЫШЕ НИХ и решил что Я СОВЕТУЮ ЕМУ ПИСАТЬ КАК НА ТЕХ КУСКАХ КОДА. вопрос, почему он игнорировал ТЕКСТ выше примеров когда методы в конструкторе??? почему он после прочтения ЗАБЫЛ ЭТОТ ТЕКСТ?
|
Цитата:
|
Погоди, я думал ты говоришь про минусы текста перед устной речью.
Но чем отличается общение в физической близости (гигиди-гигиди) и общение по скайпу? |
Цитата:
Цитата:
Забавно, что раньше моё мнение было совершенно другим, но оно изменилось под новым полученным опытом. Мб мне просто не повезло, но из всех опытов найма удалённых работников только один негатив (а когда ты платишь людям свои деньги, причём не малые, то сила разочарования сильнее), но для себя я уже решение принял. |
Махание руками, жесты, страх получить пизды, социальный статус)?
|
Цитата:
|
kobezzza,
да к сожалению не всегда получается правильно сформулировать вопрос. Именно поэтому пришел на форум. Если вопрос правильно поставлен - гугл поможет быстрее. Вы правильно меня поняли, мне действительно не нравится внутри конструктора создавать новые инстансы (даже не создавать, а описывать и создавать), когда, по идее, это можно было бы описать по другому. Вопрос закрыт. |
P.S. За свою более чем 20-и летнюю карьеру програмера первый раз спросил в форуме, и в полной мере ощутил на себе старый анекдот:
Цитата:
|
Цитата:
function Sub() { } function Sub2() { } function Base() { for (var key in this.links) { this[key] = new this.links[key](); } } Base.prototype.links = { sub: Sub, sub2: Sub2 }; Это простейший вариант без "сахара", т.е. в прототипе мы декларируем какие должны быть свойства у инстантса, а затем в конструкторе вызываем "волшебный" метод, который всё делает. Во многих языках, вроде Java нормальная практика описывать свойства класса в отдельном файле XML в виде декларативной формы, для улучшения восприятия и поддержки, так что тут можно делать что вроде этого и это нормально. |
Цитата:
|
StSpirit, чувак я же извинился, бомбануло просто))
|
Часовой пояс GMT +3, время: 18:10. |