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 21:01

kobezzza, да у меня сейчас так практически и есть - я создавал копии уже определенных объектов и атрибутов в цикле. Именно это мне не нравилось, а варианта кроме переноса огромного куска кода внутрь конструктора не видел, но походу это лучший выход. Спасибо.

Maxmaxmaximus3 02.12.2013 21:15

Цитата:

Сообщение от StSpirit
мне действительно не нравится внутри конструктора создавать новые инстансы

почему? какие недостатки?

Maxmaxmaximus3 02.12.2013 21:22

Цитата:

Сообщение от kobezzza
описывать свойства класса в отдельном файле XML в виде декларативной формы, для улучшения восприятия и поддержки

а у меня такой стиль, вначале парсим атрибуты, потом создаем переменные, оперируем с ними, и полученное засовываем в поля обьекта, после, вызываем всякие инициализационые функции:

ну короче как-то так:

function Cat(fullname, age) {
    age = age || 0;
    fullname = fullname || '';

    var reg = /\w+/img;
    var name = fullname.match(reg)[0];
    var soname = fullname.match(reg)[1];

    this.soname = soname;
    this.name = name;
    this.age = age;

    this.startTimer(1000);
}

  
Cat.prototype.startTimer = function(time) {
    setInterval(this.say.bind(this), time);
};

  
Cat.prototype.say = function() {
    alert(this.name);
};

jsru_ 02.12.2013 21:37

...

Maxmaxmaximus3 02.12.2013 21:41

Цитата:

Сообщение от jsru_
Мне кажется ты путаешь. это скорее фабрика, причем упрощенная



Нет, это фассад.

StSpirit 02.12.2013 21:53

jsru_,
Основной минус такого подхода в том что Sub() описана как глобальная функция, и теряется вся красота и логика кода - попробуйте из описания угадать где оно используется?. А вот маленькие фабрики использовать, отнюдь, не грех, само просится, мануфактура, так сказать.

kobezzza 02.12.2013 21:59

Цитата:

Сообщение от jsru_ (Сообщение 284122)
Мне кажется ты путаешь. это скорее фабрика, причем упрощенная

Это ты путаешь:)
http://dmitrysoshnikov.com/ecmascrip.../#kompozitsiya

А "фабрикой" называется функция, которая порождает новые объекты (без явного вызова конструктора и оператора new), например функция Object в JS является фабрикой:

alert(Object(1) instanceof Number);
alert(Object('foo') instanceof String);

Maxmaxmaximus3 02.12.2013 22:04

Цитата:

Сообщение от kobezzza
Это ты путаешь

он не путает он просто не знает, а то что второй 20 лет прогарммированием занимается я тоже сомневаюсь) при чем сиильно

kobezzza 02.12.2013 22:14

Цитата:

Сообщение от StSpirit (Сообщение 284125)
jsru_,
Основной минус такого подхода в том что Sub() описана как глобальная функция, и теряется вся красота и логика кода - попробуйте из описания угадать где оно используется?. А вот маленькие фабрики использовать, отнюдь, не грех, само просится, мануфактура, так сказать.

Ну опиши её в модуле:

var Base = (function () {
    function Sub() {
    }

    function Base() {
    }

    return Base;
})();


Это простейший вариант. Наружу выйдет только Base.

Maxmaxmaximus3 02.12.2013 22:18

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

var Module = new function(){


};

kobezzza 02.12.2013 22:21

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284134)
почему ты не пишешь так? круче же смотрится, да и логичнее.

var Module = new function(){


};

У меня в голове нездоровая ассоциация с new, как с созданием нового инстанса, мне твой способ менее очевиден, дело привычки.

Maxmaxmaximus3 02.12.2013 22:30

ты создаешь новый инстанс модуля тип) типа не прост функция какая то а обьект возвращает, и это модуль, у меня так, у тя не?

или ты сразу думаешь раз new значит есть какой-то класс? и что же это за класс? - да?

kobezzza 02.12.2013 22:32

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284136)
или ты сразу думаешь раз new значит есть какой-то класс? и что же это за класс? - да?

Угу, дело в том, что ОО подход я осваивал в C# и ActionScript3, так уж сложилось:)
Но скоро мы получим православный встроенный синтаксис модулей и всё будет хорошо!

jsru_ 02.12.2013 22:54

...

kobezzza 02.12.2013 23:05

Цитата:

Сообщение от jsru_ (Сообщение 284138)
все правильно, ты кинул ссылку на пример композиции, но то, что ты написал это не композиция :no:

Это ещё почему? Ты троллишь чтоли? У нас есть объект, у него есть свойство - другой объект, который является делегатом, а исходный объект делегирует ему свои обязанности и вместе они образуют композицию. Приведи хоть один аргумент подтверждения своих слов или признай, что ошибся.

Цитата:

Данное отношение объектов называется “has-a”, т.е. “имеет внутри себя” – в отличии от наследования – “is-a” – “является (наследником)”.
function Base() {
    this.sub = new Sub();
}

Base.prototype.sub = null;

function Sub() {
}


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

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

Base.prototype.sub = null;

Base.prototype.foo = function () {
    return this.sub.foo();
};

function Sub() {
}

Sub.prototype.foo = function () { alert('foo!'); }

new Base().foo();

jsru_ 02.12.2013 23:14

...

kobezzza 02.12.2013 23:19

Цитата:

Сообщение от jsru_ (Сообщение 284142)
композиция - это когда ты вызываешь метод на родительском классе и он вызывает рекурсивно методы всех композиций (composite), пока не дойдет до исполнителя (leaf). или ты думаешь, если ты вызываешь внутри конструктора другой конструктор, то они образуют композицию? :stop: ну как знаешь...

Композиция - это паттерн повторного использования кода, альтернатива наследованию, в частности множественному. То что ты говоришь - это делегирующее наследование.

kobezzza 02.12.2013 23:21

Цитата:

Сообщение от jsru_ (Сообщение 284142)
или ты думаешь, если ты вызываешь внутри конструктора другой конструктор

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

Цитата:

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

Base.prototype.sub = null;

Base.prototype.foo = function () {
    return this.sub.foo();
};

function Sub() {
}

Sub.prototype.foo = function () { alert('foo!'); }

new Base().foo();


Maxmaxmaximus3 02.12.2013 23:46

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

kobezzza, кстати , а в твоем примере если бы Sub должен был бы знать что-то о Base, то это означало бы что мы делаем что-то не правильно? (Так как в данном случае Subы не должны ни чего знать о Base)

kobezzza 02.12.2013 23:53

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284153)
kobezzza, кстати , а в твоем примере если бы Sub должен был бы знать что-то о Base, то это означало бы что мы делаем что-то не правильно? (Так как в данном случае Subы не должны ни чего знать о Base)

Ну, я всегда против того, когда "вложенный" объект знает о своём родителе, но если нужно нужна провязка, то сам Бог велел использовать обсёрвер, и это будет самое разумное решение:) Вообще event-driven - это здорово, если бы порой это не было бы так запутано, поэтому и придумали FRP (но мы то знаем, что внутри всё те же события).

Maxmaxmaximus3 03.12.2013 00:04

но забываем о них чтобы не было запутанно ;)

Верно ли я понял что ты в таком случае предлагаешь делать Sub EventEmitter'ом и сувать в него какие-то калбаки от Base?

kobezzza 03.12.2013 00:08

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284157)
Верно ли я понял что ты в таком случае предлагаешь делать Sub EventEmitter'ом и сувать в него какие-то калбаки от Base?

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

Maxmaxmaximus3 03.12.2013 00:08

лол, раз заговорили o FRP решил добавить скоупу новый метод "ячейка"



я думаю не надо обьяснять чо он делает ^__^

kobezzza 03.12.2013 00:14

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

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

Maxmaxmaximus3 03.12.2013 00:21

неее, чувак, ты не понял, во первых это сахар и внутри это выражене все ровно превратится в функцию)

ни кто не мешает написать и так:



это по сути обычный сахар на геттер =) (да у меня будут геттеры так как не смотря на потенциальную возможность поддержки ишаков я не собираюсь ограничиваться из за них ДАЖЕ В ТАКОЙ МЕЛОЧИ)

kobezzza 03.12.2013 00:26

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284165)
неее, чувак, ты не понял, во первых это сахар и внутри это выражене все ровно превратится в функцию)

Ну это понятно, но ведь Closure Compiler про это не знает?

Цитата:

ни кто не мешает написать и так:



это по сути обычный сахар на геттер =) (да у меня будут геттеры так как не смотря на потенциальную возможность поддержки ишаков я не собираюсь ограничиваться из за них ДАЖЕ В ТАКОЙ МЕЛОЧИ)
Красивей с () => :)

Я кстати юзаю встроенные setter/getter-ы - оч удобно, а Ишак древний пусть катится в попу:) Там ради одно flex в CSS уже можно забить на все кроме 11-й версии:D

Maxmaxmaximus3 03.12.2013 00:27

В ПРИНЦИПЕ я могу замутить так, а потом контроллеры прогонять через свой мини транслятор на лету =) как идея?
И сжимается, и вообще красота ^_^



Правда если есть переменная с именем q то она сожмется неверно, и тогда человеку придется писать не сахарно а руками функцию написать туда. но это мелочи.

kobezzza 03.12.2013 00:28

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284169)
В ПРИНЦИПЕ я могу замутить так, а потом контроллеры прогонять через свой транслятор на лету =) как идея?


Ты получишь варнинги от ИДЕ, компилятор кинет ошибку и вообще не стоит так делать:)
Лучше юзать красивые, стильные и молодёжные Arrow Function :)

Я бы на твоём месте забил на инлайн синтаксис, ибо в данном контексте это скорее антифича, т.к. в реальной жизни её мало кто будет юзать из-за целого пласта проблем при сжатии.

StSpirit 03.12.2013 00:35

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284129)
он не путает он просто не знает, а то что второй 20 лет прогарммированием занимается я тоже сомневаюсь) при чем сиильно

я рад что вы нашли о чем писать на 7 страниц. Как ни странно, но полезную для себя инфу я таки получил.
Еще раз, спасибо.

Maxmaxmaximus3 03.12.2013 00:35

Почему не делать так, хоть один минус?
1) так ни кто СЛУЧАЙНО не делает
2) синтаксически правильно
3) красиво
4) очевидно




Цитата:

Сообщение от StSpirit
Еще раз, спасибо.

да не вопрос, и без обид) вспылил

kobezzza 03.12.2013 00:39

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284173)
Почему не делать так, хоть один минус?
1) так ни кто СЛУЧАЙНО не делает
2) синтаксически правильно
3) красиво
4) очевидно


Вся та же проблема: GCC с радостью всё проинлайнит, что ты потом не сделаешь "замену на лету"

Maxmaxmaximus3 03.12.2013 00:40

ДА БЛИН, кто использует такое ПУСТЬ НЕ ИСПОЛЬЗУЕТ GGC или каменты оставляет.


ты посмотри какая красота ^__^



чертов GGC
function Ctrl(a){a.q="fdf";a.w={name:a.q,age:1}};


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

kobezzza 03.12.2013 00:43

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284176)
ДА БЛИН, кто использует такое ПУСТЬ НЕ ИСПОЛЬЗУЕТ GGC или каменты оставляет.




ты посмотри какая красота ^__^

function Ctrl(a){a.q="fdf";a.w={name:a.q,age:1}};

Ну я не готов отказаться от GCC:)

$scope.export = {
    set w(v) { $scope.c += v; }
};


где export - это сеттер, т.е.

$scope = {
    set export(v) { ... }
};


Сжимается, коротко, красиво

Maxmaxmaximus3 03.12.2013 00:49

сделай ка мне на сеттерах вот такую форму ;)


kobezzza 03.12.2013 00:50

$scope.export = {
    formData: {
        set name(v) { ... },
        set pass(v) { ... },
        set date(v) { ... }
    }
};


Ну а ваще дело твоё, я просто сказал о возможных проблемах) Лан я спать, удачи.

Maxmaxmaximus3 03.12.2013 00:53

окей, теперь сравни с:




добавил фитчу со знаком бакса =) выглядит как вызов функции, правда?

А по скольку мы знаем что неймспейс $ в UI служебный то проблем не будет =)

kobezzza 03.12.2013 00:54

Цитата:

Сообщение от Maxmaxmaximus3 (Сообщение 284182)
окей, теперь сравни с:




добавил фитчу со знаком бакса =) выглядит как вызов функции, правда?

Ну здесь вроде получше.

Maxmaxmaximus3 03.12.2013 00:55

Да царское же решение, признай =)!!!
А по скольку мы знаем что неймспейс $ в UI служебный то проблем не будет

kobezzza 03.12.2013 00:59

Ну попробуй)

Maxmaxmaximus3 03.12.2013 01:02

всегда актуальная дата


напомню что рендерится все изменившееся по анимейшенФрейму так что с производительностью все норм =)
щас запилю.


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