|
Объект внутри прототипа
Подскажите, как красивее всего создавать объекты внутри прототипа. Например, есть:
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() {}; } у дверей есть методы для работы с ихними данными, а дом их подгружает и распихивает по дверям. и вообще: ЧО ТЫ БЛЯТЬ НЕСЕШЬ????? как ВООБЩЕ связана наша тема разговора с ПРОТОТИПАМИ И НАСЛЕДОВАНИЕМ ????????????????????? мы тут смотрим как архитектуру сделать, при чем тут прототип???????? короче суть, методы запихиваешь в прототип, НЕ МЕТОДЫ запихиваешь НЕ В ПРОТОТИП, все это точка. и это ВООБЩЕ ни как не связано с тем о чем мы говорим. ТЫ ПОНЯЛ ЭТО? ПОВТОРЯЙ: скажи "Архитектурный вопрос совершенно не связан с прототипами", а потом мы продолжим.. тя просто ляпнул хуйню типа "а ну ок, тогда все буду пихать в конструктор" ИЗ МОИХ СЛОВ ВООБЩЕ ТАКОЕ НЕ ИСХОДИТ. окей давай начнем все с чистого листа: что ты хочешь сделать? спроси и я подскажу как. |
Часовой пояс GMT +3, время: 12:00. |
|