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