Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.12.2013, 16:16
Интересующийся
Отправить личное сообщение для StSpirit Посмотреть профиль Найти все сообщения от StSpirit
 
Регистрация: 02.12.2013
Сообщений: 13

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

Последний раз редактировалось StSpirit, 02.12.2013 в 16:29.
Ответить с цитированием
  #2 (permalink)  
Старый 02.12.2013, 16:37
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

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

Если на каждый экземпляр TObject нужен отдельный экземпляр run, то, очевидно, его нужно создавать в конструкторе TObject.
Ответить с цитированием
  #3 (permalink)  
Старый 02.12.2013, 16:45
Профессор
Посмотреть профиль Найти все сообщения от Maxmaxmaximus3
 
Регистрация: 18.11.2013
Сообщений: 275

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


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


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


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

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


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

Последний раз редактировалось Maxmaxmaximus3, 02.12.2013 в 16:49.
Ответить с цитированием
  #4 (permalink)  
Старый 02.12.2013, 16:46
Интересующийся
Отправить личное сообщение для StSpirit Посмотреть профиль Найти все сообщения от StSpirit
 
Регистрация: 02.12.2013
Сообщений: 13

vasa_c,
Вы правильно поняли, но, я не совсем понимаю как это правильно описать?
Делать отдельный объект? - Нет, но как описать его частью TObject, и правильно создать внутри конструктора?
Ответить с цитированием
  #5 (permalink)  
Старый 02.12.2013, 16:50
Интересующийся
Отправить личное сообщение для StSpirit Посмотреть профиль Найти все сообщения от StSpirit
 
Регистрация: 02.12.2013
Сообщений: 13

Maxmaxmaximus3, спасибо, но случай указанный вами я описал в самом начале. Мне интересно, как красиво создать объект со своими методами уже внутри другого объекта, так что бы он оставался частью родителя.
Ответить с цитированием
  #6 (permalink)  
Старый 02.12.2013, 16:52
Профессор
Посмотреть профиль Найти все сообщения от Maxmaxmaximus3
 
Регистрация: 18.11.2013
Сообщений: 275

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

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

Последний раз редактировалось Maxmaxmaximus3, 02.12.2013 в 16:56.
Ответить с цитированием
  #7 (permalink)  
Старый 02.12.2013, 17:01
Интересующийся
Отправить личное сообщение для StSpirit Посмотреть профиль Найти все сообщения от StSpirit
 
Регистрация: 02.12.2013
Сообщений: 13

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

Последний раз редактировалось StSpirit, 02.12.2013 в 17:04.
Ответить с цитированием
  #8 (permalink)  
Старый 02.12.2013, 17:27
Профессор
Посмотреть профиль Найти все сообщения от Maxmaxmaximus3
 
Регистрация: 18.11.2013
Сообщений: 275

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

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

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

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

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


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

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, 02.12.2013 в 17:36.
Ответить с цитированием
  #9 (permalink)  
Старый 02.12.2013, 17:46
Интересующийся
Отправить личное сообщение для StSpirit Посмотреть профиль Найти все сообщения от StSpirit
 
Регистрация: 02.12.2013
Сообщений: 13

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

Последний раз редактировалось StSpirit, 02.12.2013 в 17:51.
Ответить с цитированием
  #10 (permalink)  
Старый 02.12.2013, 18:08
Профессор
Посмотреть профиль Найти все сообщения от Maxmaxmaximus3
 
Регистрация: 18.11.2013
Сообщений: 275

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

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:11.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищу функцию для canvas, которая будет перемещать мой объект на позицию х,у eko24 Events/DOM/Window 0 12.10.2013 00:33
Создать объект в объекте Bryant-24 Общие вопросы Javascript 3 10.07.2013 16:06
Как гугл получает объект внутри тега <script>? zilker Events/DOM/Window 4 19.03.2013 17:19
Передать ссылку на объект а не объект возникновения события Blazze Events/DOM/Window 0 11.10.2011 00:45
Получить объект содержащий caller no_alex Общие вопросы Javascript 14 20.03.2009 21:37