Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Объект внутри прототипа (https://javascript.ru/forum/misc/43350-obekt-vnutri-prototipa.html)

StSpirit 02.12.2013 16:16

Объект внутри прототипа
 
Подскажите, как красивее всего создавать объекты внутри прототипа. Например, есть:
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", и нужно руками делать копию.
Подскажите, пожалуйста, правильный вариант.

vasa_c 02.12.2013 16:37

Правильный вариант зависит от задачи, которую не понять.

Если на каждый экземпляр TObject нужен отдельный экземпляр run, то, очевидно, его нужно создавать в конструкторе TObject.

Maxmaxmaximus3 02.12.2013 16:45

в прототип пихают только то что одинаковое для всех сущностей класса, в конструктор же пихают уникальное. конец.


function Cat() {
  this.name = 'Ашот'
}
  
Cat.prototype.say = function(){
  alert(this.name)
};


все коты умеют говорить, но имя у всех разное.


п.с. а ОБЩЕЕ для всех сущностей пихают в конструктор =) и называется это статическое свойство

function Cat() {
  Cat.count++;
}
Cat.count = 0;


и в Cat.count у нас всегда будет лежать количество созданных котов =) например. сount - статическое свойство

StSpirit 02.12.2013 16:46

vasa_c,
Вы правильно поняли, но, я не совсем понимаю как это правильно описать?
Делать отдельный объект? - Нет, но как описать его частью TObject, и правильно создать внутри конструктора?

StSpirit 02.12.2013 16:50

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

Maxmaxmaximus3 02.12.2013 16:52

StSpirit, это бред, и красиво сделать бред у тебя вряд ли получится. Я понмиаю что ты ХОЧЕШЬ сделать так. Но ХОЧЕШЬ ты так потому что ты плохо программируешь, и надо ПЕРЕСТАВАТЬ так хотеть программировать прежде всего. Это я и пытаюсь донести, не забывай что у того что ты делаешь именно так и у того что ты ВООБЩЕ программируешь - ЕСТЬ ЦЕЛЬ. Само программирование лишь средство а не сама цель. Ты используешь плохо это средство. Обьяснить почему?

Цитата:

Сообщение от StSpirit
Мне интересно, как красиво создать объект со своими методами уже внутри другого объекта

я не понял вопроса, переформулируй по другому что и зачем ты хочешь сделать? какую проблему хочешь решить. возможно я подскажу более лучшее решение. или тебя интересует именно как сделать ТАКОЙ выкрутас? Хочешь проверить язык на гибкость? Тогда опиши четче что нужно и я сделаю это.

StSpirit 02.12.2013 17:01

Maxmaxmaximus3, спасибо за столь подробный комментарий.
Вопрос был таков:
Есть дом, у него парадная дверь, она имеет створки, створки двери имеют свои методы отрытия/закрытия, каждая дверь хочет быть частью дома со своими параметрами, а не массивом дверей. Домов много.
Так понятнее?

Maxmaxmaximus3 02.12.2013 17:27

В таком случае дверь это обьект сервер а дом это объект клиент?
Должны ли двери сами себя открывать или дом или должен управлять?
Должны ли двери знать что-то о доме?

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

У дверей должен быть интерфейс, и у дома интерфейс. Дом должен создавать массив в который кладутся двери. Двери не должны ничего знать о доме и о том где они лежат. И они должны иметь методы за которые дом мог бы ими управлять а эти методы что-то возвращать, возможно, интересное для дома.

И я совершенно не понимаю при чем тут вообще прототип?

Ты в курсе что прототип ВООБЩЕ не используется по уму? Люди пихают в прототип разные методы просто чтобы память не жралась и все, это ФИШКА такая, ТРЮК! Сам яваскрипт не так задуман!


по уму надо все пилить в конструктор

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() {};
}

StSpirit 02.12.2013 17:46

Maxmaxmaximus3, и дом и двери, всё клиент.
Спасибо, судя по вашим высказываниям вы предлагаете методы подобъекта описать внутри конструктора. Мне такой подход не очень нравился, поэтому и спрашивал, хотелось описать снаружи, но, похоже самый действенный вариант - принимаю.
P.S. Прототип как раз использую потому как очень много данных (десятки мегабайт в разные "дома") нужно подгружать и контролировать этот процесс.

Maxmaxmaximus3 02.12.2013 18:08

Ну я тебе показал как контролируется это

function Home() {
    this.doors = [];
    this.openDoors = function() {
      this.doors.forEach(function(door) {door.open()});
    }
}

function Door() {
    this.open = function() {};
    this.close = function() {};
}



у дверей есть методы для работы с ихними данными, а дом их подгружает и распихивает по дверям.

и вообще: ЧО ТЫ БЛЯТЬ НЕСЕШЬ????? как ВООБЩЕ связана наша тема разговора с ПРОТОТИПАМИ И НАСЛЕДОВАНИЕМ ????????????????????? мы тут смотрим как архитектуру сделать, при чем тут прототип????????

короче суть, методы запихиваешь в прототип, НЕ МЕТОДЫ запихиваешь НЕ В ПРОТОТИП, все это точка. и это ВООБЩЕ ни как не связано с тем о чем мы говорим. ТЫ ПОНЯЛ ЭТО? ПОВТОРЯЙ:

скажи "Архитектурный вопрос совершенно не связан с прототипами", а потом мы продолжим..


тя просто ляпнул хуйню типа "а ну ок, тогда все буду пихать в конструктор" ИЗ МОИХ СЛОВ ВООБЩЕ ТАКОЕ НЕ ИСХОДИТ.


окей давай начнем все с чистого листа: что ты хочешь сделать? спроси и я подскажу как.

Maxmaxmaximus3 02.12.2013 18:13

Итак поехали заного, твой вопрос не связан с протоитпами вообще. С этим пока все понятно? Если да, то я продолжу.

и вообще,пиши мне вконтакте https://vk.com/max_max_maximus


Цитата:

Сообщение от StSpirit
Спасибо, судя по вашим высказываниям вы предлагаете методы подобъекта описать внутри конструктора.

ГДЕЕЕ ГДЕ БЛЯТЬ Я ТАКОЕ ВООБЩЕ СКАЗАЛ??? у тебя галюцинаяии парнь. методы ВСЕГДА! ВСЕГДА пишутся в прототипе. ты по ходу ТУПОЙ или читал ЖОПОЙ то что я пишу, окей раз ты ТУПОй я напишу сНОВА но уже подругому:

яяяяяя, писааал, тупой ты мой друг, методы внутри конструктора ЛИШЬ ДЛЯ ТОГООООО чтобы показать что ПРОТОТИП ВООБЩЕ НЕ ПРИ ЧЕММ И МОЖНО ПРОГРАММИРОАВТЬ БЕЗ НЕГО, Я ПИСАЛ ИХ ТАМ ТООООЛЬКО ДОЯ ЭТОГОООО, ТОЛОЛЛКОТ И ТООООЛЬКО ТОЛЬКО И ТОООЛКЛТО ИТОЛЬКО И НЕЕ ДЛЯ ЧЕГО ДРУГООГООО, Я МЕЖДУ ПРОЧИМ ДОПОГЛАЗЫЙ ТЫ ПМОЙ УЕБОК ТАК И СКАЗА1!! Я ДАААААААААААААЛ ПОЯТЬ ДЛЯ ЧЕГО Я ПИШУ ИХ НЕ В ПРОТОТИПЕ1111 ТЫ ПРОСТО ТУПИЦА КАКИХ СВЕТ НЕВИДОВАЛ ИДИ НАХУЙ МРАХЗИНА Е БНАНЯ1

Maxmaxmaximus3 02.12.2013 18:18

мне полегчало, можем продолжать, итак поехали заного, раз у тебя есть много обьектов и у них есть что-то общее то зачем ты хочешь засунуть это общее в прототип? а я скажу зачем! потому что ты не умеешь программировать и не знаешь что такое прототип. но я помогу тебе: НЕ НАДО ТАК. помог? отлично, если у тебя есть дом и двери? то двери это НЕЕ сущности а дом это НЕЕЕ прототип.. и ДВЕРИ и ДОМ это 2 разные сущности сука! так что создаватй под каждую сущность свой класс как я показалд выше, и у них клиент серверные отношения, двери это сервера а дом это клиент.

Maxmaxmaximus3 02.12.2013 18:18

короче Здравствуйте!

Судя по вашему сообщению, вы ну совсем не знаете javascript.

Освойте основы языка и вопрос отпадет сам, полностью или частично.
А с чем не справитесь - поможем.

На сайте javascript можно начать изучать с учебника, раздел Основы javascript.
Возможно, вам также понадобится HTML - учебник есть, например, здесь: http://ru.html.net/tutorials/html/

Задавайте конкретные вопросы по ходу дела.

Maxmaxmaximus3 02.12.2013 18:19

фпизду ни когда больше не зайду в этот раздел с тупицами

Maxmaxmaximus3 02.12.2013 18:20

долбоеб блять, пишу ему сука одно а он мне "аааа, как я понял надо все пихать в конструктор???" БЛЯЯЯТЬ УБЕЙСЯ ПРИДУРОК УБЕЙСЯ1111 ТЫ НЕ ПОНМИАЕШЬ ЗНАЧЕНИЯ БУКОВ!!1 ОНИ СОЧИТАЮТ СЛОВА А ОИ СОЧИТАЮТ ПРЕДЛОЖЕНИЯ А NT ОБЬЕДИНЯЮТСЯ В МЫСЛИ СУКА!11 ТЫ НЕ УМЕЕШЬ РАСШИФРОВЫВАТЬ БУКВОПОСЛЕДОВАТЕЛЬНОСТЬ В МЫСЛИ!1111 ТУПИЦА КАК ТЫ ВООБЩЕВ ОБЩЕСТВЕ ВЫЖИВАЕШЬ!11

Maxmaxmaximus3 02.12.2013 18:21

ПРОТОТИП это И ЕСТЬ ВСЕ ДВЕРИ БЮЛЯТЬ

ПРОТОТИП ЭТО И ЕСТЬ ДВЕРИ СУКА!!1

ПРОТОТИП ====== ДВЕРЬ!!

ПРОТОТИП ЭТО НЕ ДОМ СУКА!!
ДОМ НЕ МОЖЕТ ЯВЛЯТЬСЯ ПРОТОТИПОМ ДВЕРЕЙ!! ДОМ ЭТО НОВЫЙ КЛАСС БЛЯТЬ!!1

Maxmaxmaximus3 02.12.2013 18:21

В АНУС СЕБЕ МЕГАБАЙТЫ ДАННЫХ ПОДГРУХЗИ ПРИДУРОК!1 ТЕБЕ НЕ СТАТЬ ПРОГРАММИСТОМ КАК Я 1!1 НИКОГДА!1

StSpirit 02.12.2013 18:21

Maxmaxmaximus3,
предыдущий ваш ответ был содержателен, этот уже переходит всякие рамки. Спасибо, более в ваших советах не нуждаюсь.
P.S. Ваш коммент намбер раз:
Цитата:

Ты в курсе что прототип ВООБЩЕ не используется по уму? Люди пихают в прототип разные методы просто чтобы память не жралась и все, это ФИШКА такая, ТРЮК! Сам яваскрипт не так задуман!
Каммент набер два:
Цитата:

и вообще: ЧО ТЫ БЛЯТЬ НЕСЕШЬ????? как ВООБЩЕ связана наша тема разговора с ПРОТОТИПАМИ И НАСЛЕДОВАНИЕМ ????????????????????? мы тут смотрим как архитектуру сделать, при чем тут прототип????????
Сожалею, но я за вашей истерикой уже не вижу конкретики, спасибо за содержательный комментарии.

Maxmaxmaximus3 02.12.2013 18:21

ПОКА БЛЯТЬ НЕ НАУЧИШЬСЯ БУКВОПОСЛЕДОВАЕТЕЛЬНОСТЬ В МЫСЛИ РАСШИФРОВЫВАТЬ!111 ЕЩЕ ВОПРОСЫ ЕСТЬ???????????????????????????????????????

Maxmaxmaximus3 02.12.2013 18:22

АА, КОНЕНЧО ЕСТЬ, ТЫ ЖЕ ТУПОООЙ!!! НАДО ЖЕ БЛЯТЬ ЧЕТВЕРТЫЙ СУКА РАЗ ПРО ДЖВЕРИ НАПИСАТ И ПРИМЕР СКИНУТИь!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() {};
  }

Maxmaxmaximus3 02.12.2013 18:23

НЕЛЬЗЯ ДОМ ПИХАТЬ В ПРОТОТИП ДВЕРЕЙ!!!!!!!!!!!


ПОТОМУ ЧТО ПРОТОРИПОМ ДВЕРЕЙ ДОЛЖНА БЫТЬ ДВЕРЬ ТОЛЬКО ДРУГАЯ!!1!!1111


ДВЕРИ НЕ НАСЛЕДУЮТ ОТ ДОМА БЛЯТЬ!!! ДВЕРИ ЭТО НЕ ИЗМЕНЕННЫЕ ВЕРИСИИ ДОМА!!1 /\\\



КАК ВООБШЩЕ АРХИТЕКТУРНЫЙ ВОПРОС БЛЯТЬ СВЯЗАН С НАСЛЕДОВАНИЕМ???????????????????????? ?????????????



У МЕНЯ БЛЯТЬ КРЫША ЕДЕТ С ТВОЕЙ ТУПОСТИ

Maxmaxmaximus3 02.12.2013 18:24

ушел в баню

StSpirit 02.12.2013 18:24

У вас истерика, но это излечимо, я надеюсь

Maxmaxmaximus3 02.12.2013 18:26

да забей, я просто расстроился что ты путаешь прототип и хуй пойми что)

теперь то понял как надо делать)?
есть у тебя есть двери и дом, но дом это не прототип дверей, а отдельная сущность =) все просто
я просто злился от того что не мог понять хуиту которую ты несешь, щас понял что ты просто дом пихал в прототип) и мне сразу полегчало. теперь то понял как надо делать)?

Maxmaxmaximus3 02.12.2013 18:29

Короче дай ка мне пример своего кода и я переделаю как надо

StSpirit 02.12.2013 18:33

Maxmaxmaximus3, offtopic: Я сожалею что мы говорим на разных языках. Свой вопрос я описал максимально точно, и хотел получить ответ не о своих умственных возможностях, а о возможностях языка описывать под-классы. Я надеялся что есть более красивые методы, кроме тех что ты, чм№;%№;%о, перечисло.
P.S. Давать 90к кода не вижу смысла.

kobezzza 02.12.2013 18:44

Я так понял автор топика говорит о "композиции", т.е. когда один инстанс является свойством другого. Довольно частая и тривиальная задача, в общем случае нужно просто создавать новый инстанс-свойство внутри конструктора основного инстанса.

function Base() {
    this.sub = new Sub();
}

Base.prorotype.sub = null;

function Sub() {
}


Желание скрыть явное определение свойства в конструкторе мне кажется странным, но это конечно можно сделать через всякие враперы, но зачем? Код должен быть очевидным и понятным, а каждая ложка "магии" только запутывает общую картинку.

Maxmaxmaximus3 02.12.2013 19:27

kobezzza, эм.... вот тебя не бесит от что мы должны "КАЖЕТСЯ ПЫТАТЬСЯ" понять..? у меня бомбануло ядерно от того что человек не верно использует и термины и вообще не понмиет сути.

kobezzza 02.12.2013 19:43

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284096)
kobezzza, эм.... вот тебя не бесит от что мы должны "КАЖЕТСЯ ПЫТАТЬСЯ" понять..? у меня бомбануло ядерно от того что человек не верно использует и термины и вообще не понмиет сути.

Я 2 года преподавал в универе, научился спокойно реагировать :) Хотя перлы были, например однажды на экзамене студент доказывал мне, что я им целый семестр рассказывал про C#, хотя я вёл курс по JS :)

Maxmaxmaximus3 02.12.2013 19:49

у меня так бомбануло в тот момент когда он написал "исходя из ваших слов методы надо писать в конструкторе и тогда, архитектурная проблема решится?" ох у меня бомбануло. я там вообще не писал что методы надо в конструкторе писать, а лишь привел пример как можно программировать обьясняя что прототип не при чем и не связан с нашим вопросом, но он тупой и увидел те куски кода ПРОИГНОРИРОВАЛ ТЕКСТ который следовал ВЫШЕ НИХ и решил что Я СОВЕТУЮ ЕМУ ПИСАТЬ КАК НА ТЕХ КУСКАХ КОДА. вопрос, почему он игнорировал ТЕКСТ выше примеров когда методы в конструкторе??? почему он после прочтения ЗАБЫЛ ЭТОТ ТЕКСТ?

kobezzza 02.12.2013 19:53

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284104)
у меня так бомбануло в тот момент когда он написал "исходя из ваших слов методы надо писать в конструкторе и тогда, архитектурная проблема решится?" ох у меня бомбануло

Ну тут ещё минус дурацкого форумного общения, т.к. часто бывает что люди говорят об одном и том же, но не понимают друг друга. Я когда на работу к себе на удалёнку людей брал потом зарёкся никогда этого больше не делать, ибо это ад, когда общение всё сводится на скайпе, поэтому после НГ буду офис снимать, чтобы в офис людей нанимать. Дороже конечно выходит, но КПД значительно выше.

Maxmaxmaximus3 02.12.2013 20:14

Погоди, я думал ты говоришь про минусы текста перед устной речью.
Но чем отличается общение в физической близости (гигиди-гигиди) и общение по скайпу?

kobezzza 02.12.2013 20:22

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284106)
Погоди, я думал ты говоришь про минусы текста перед устной речью.

Безусловно я это имел ввиду, но и сказал о общем преимуществе реального общения перед виртуальным. В реальном общение учитываются личные характеристике людей, такие как харизма и влиятельность. Я вообще стал противником даже общения по телефону, т.к. считаю, что общение в личной встрече ничто не может заменить.

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284106)
Но чем отличается общение в физической близости (гигиди-гигиди) и общение по скайпу?

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

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

Maxmaxmaximus3 02.12.2013 20:28

Махание руками, жесты, страх получить пизды, социальный статус)?

kobezzza 02.12.2013 20:30

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284108)
Махание руками, жесты, страх получить пизды, социальный статус)?

В точку попал, но ещё сам факт, что ты приходишь в офис, грубо говоря в место, где все работают, то и желание про**ываться меньше.

StSpirit 02.12.2013 20:31

kobezzza,
да к сожалению не всегда получается правильно сформулировать вопрос. Именно поэтому пришел на форум. Если вопрос правильно поставлен - гугл поможет быстрее.
Вы правильно меня поняли, мне действительно не нравится внутри конструктора создавать новые инстансы (даже не создавать, а описывать и создавать), когда, по идее, это можно было бы описать по другому. Вопрос закрыт.

StSpirit 02.12.2013 20:46

P.S. За свою более чем 20-и летнюю карьеру програмера первый раз спросил в форуме, и в полной мере ощутил на себе старый анекдот:
Цитата:

Национальные особенности.
Американский форум: задаешь вопрос - получаешь ответ.
Еврейский форум: задаешь вопрос - получаешь встречный вопрос.
Русский форум: задаешь вопрос - тебе долго обьясняют, какой ты муд-к.

kobezzza 02.12.2013 20:48

Цитата:

Сообщение от StSpirit (Сообщение 284110)
Вы правильно меня поняли, мне действительно не нравится внутри конструктора создавать новые инстансы (даже не создавать, а описывать и создавать), когда, по идее, это можно было бы описать по другому. Вопрос закрыт.

Как вариант:

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 в виде декларативной формы, для улучшения восприятия и поддержки, так что тут можно делать что вроде этого и это нормально.

kobezzza 02.12.2013 20:49

Цитата:

Сообщение от StSpirit (Сообщение 284112)
P.S. За свою более чем 20-и летнюю карьеру програмера первый раз спросил в форуме, и в полной мере ощутил на себе старый анекдот:

Тебе просто не повезло:)

Maxmaxmaximus3 02.12.2013 21:00

StSpirit, чувак я же извинился, бомбануло просто))


Часовой пояс GMT +3, время: 18:10.