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



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

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

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

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


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


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


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