На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU, ANDLL, fatalist
Страницы: (11) « Первая ... 5 6 [7] 8 9 ... Последняя » все  ( Перейти к последнему сообщению )  
> функциональное наследование , по мотивам Дугласа Крокфорда
    Цитата Cfon @
    а ну я просто чтобы уменьшить объем текста цитаты жал на кнопку "быстрая цитата".

    Ага, только не понятно на что ты отвечаешь, всего-то.
      Цитата Serafim @
      Ты лет на 5 отстал от жизни. Подсказываю, открываешь консоль в хроме и пишешь `class VJSNetClassovYaTochnoUveren {}`

      возможно но не в программировании :D
        Serafim, оставь его в покое, не видишь что ли, человек прется с прототипной системы, ему кажется, что он познал дзен и ИСТИНУ :) Наиграется, пару раз споткнется о цепочку наследования, о потерянный контекст и прочие прелести - и тут же полюбит весь сахар :D
        Сообщение отредактировано: Астарот -
          Цитата K313 @
          И коды тестов тоже мог бы и выложить, а не просто цифры нам называть :whistle:

          т.е. ты мне не веришь? >:(
          да и пох! :D
            Cfon, а ты знаешь, что помимо protype ещё есть __proto__?

            Скрытый текст
            fatality :troll:
              Цитата Serafim @
              Cfon, а ты знаешь, что помимо protype ещё есть __proto__?

              да знаю, оно позволяет получить доступ к прототипу объекта, как правило его не следует юзать, лучше функцию Object.getPrototypeOf() :)

              Добавлено
              Цитата Астарот @
              Наиграется, пару раз споткнется о цепочку наследования, о потерянный контекст и прочие прелести - и тут же полюбит весь сахар :D

              врядли я не собираюсь юзать наследование на практике, его в JS я изучаю просто для полноты картины языка и проверки его средств :)

              если есть примерчик того где я могу заблудиться в контекстах велком, буду рад размять кости :D
              Сообщение отредактировано: Cfon -
                ExpandedWrap disabled
                  let Some = {};
                   
                  Some.protoype.alert = function(message) { console.log(message); }
                   
                  Some.prototype.todo = function() { this.alert('This is a message every 1 second'); }
                   
                  setInterval(new Some.todo, 1000);


                Развлекайся :whistle:
                  Цитата Serafim @
                  Скрытый текст
                  ExpandedWrap disabled
                    let Some = {};
                     
                    Some.protoype.alert = function(message) { console.log(message); }
                     
                    Some.prototype.todo = function() { this.alert('This is a message every 1 second'); }
                     
                    setInterval(new Some.todo, 1000);

                  Развлекайся :whistle:

                  легко :D

                  во-первых, так нельзя писать на JS :wacko:
                  в случае записи литералом, прототип объекта не доступен! разве что __proto__, но это свойство не везде реализовано, можно через Object.getPrototypeOf(), но тогда незабываем что методы будут добавлятся к Object.prototype.

                  правильно надо так:
                  ExpandedWrap disabled
                    // фукнция-конструктор
                    var Some = function () {};
                    Some.prototype.alert = function (message) {
                        console.log(message);
                    }
                    Some.prototype.todo = function () {
                        this.alert('This is a message every 1 second');
                    }

                  или так
                  ExpandedWrap disabled
                    // объект-литерал
                    var some = {
                        alert: function (message) {
                            console.log(message);
                        },
                        todo: function () {
                            this.alert('This is a message every 1 second');
                        }
                    };

                  во-вторых, в setInterval ты передаешь функцию без контекстом вызова, точнее с глобальным контектом, в случае броузера это объект window,
                  как быть? все просто надо его привязать след образом:
                  ExpandedWrap disabled
                    var some = new Some();
                    setInterval(some.todo.bind(some), 1000);

                  или
                  ExpandedWrap disabled
                    setInterval(some.todo.bind(some), 1000);

                  еще примеры :)
                  Сообщение отредактировано: Cfon -
                    ну да, там функция должна быть, очепятался
                      шо все больше нет примеров? :blush:
                      лана не суть :D

                      так протестировал я тут еще один вариант, с привязкой методов
                      ExpandedWrap disabled
                                // case 2
                                // объект Person с реализацией методов
                                var Person = {
                                    getName: function () {
                                        return this.name;
                                    },
                                    getAge: function () {
                                        return this.age;
                                    },
                                    addFriend: function (friend) {
                                        this.friends.push(friend);
                                    },
                                    toString: function () {
                                        var s = '';
                                        var len = this.friends.length;
                                        if (len > 0) {
                                            for (var i = 0; i < len; ++i) {                  
                                                s += this.friends[i].getName() + ', ';
                                            }
                                            s = s.slice(0, s.length - 2);                
                                            s += (len > 1) ? ' are friends.' : ' is a friend.';
                                        }            
                                        return this.name + ' is a ' + this.age + ' years old. ' + s;
                                    }
                                };    
                                        
                                // фабрика объектов с привязкой методов из объекта Person
                                var createPerson = function (obj) {
                                    var person = {};        
                                    person.getName = Person.getName.bind(obj);
                                    person.getAge = Person.getAge.bind(obj);
                                    person.addFriend = Person.addFriend.bind(obj);
                                    person.toString = Person.toString.bind(obj);
                                    return person;
                                };

                      и вот что получил:
                      1. 5 Мб (расходуемой памяти)
                      2. 4.3 Мб

                      тесты проводил для 10,000 объектов, для 100,000 - ~20 Mb и 16Mb и это тока при такой малой реализации объекта.
                      первый результат это исходный пример см файл case1.html, ну а второй - c привязкой case2.html, видно что на втором тесте памяти расходуется меньше, чем в первом, т.е можно сделать вывод, что объем памяти занимаемой объектом в случае привязки методов будет меньше, чем если определять методы в самом объекте.

                      Чтобы протестировать, запускаете Chrome => Developer Tools => Memory ставите переключатель на Take Heap Snapshot и жмете кнопку Take Snapshot и зерите скока памяти жрут объекты в хипе. ВСЕ! :D

                      Прикреплённый файлПрикреплённый файлtests.rar (1,72 Кбайт, скачиваний: 145)

                      да еще анализируя результаты в Хроме, заметил что в первом случае раздел system/Context занимает ~10,000 объектов при тесте 10,000 объектов, а вот во втором с привязкой всего 125 объектов, видимо в этом есть ответ на вопрос.
                      Сообщение отредактировано: Cfon -
                        продолжаю забивать в крышку гроба гвозди :blush:
                        на этот раз еще одна цитата из другой хорошей книжки Raffaele Cecco "Supercharged JavaScript Graphics"

                        Цитата Глава 1. Многократное использование кода и его оптимизация
                        Одно из достоинств использования наследования через прототипы заключается в эффективном применении памяти; свойства и методы прототипа объекта сохраняются лишь однажды, независимо от того, сколько раз от них происходит наследование.
                        У функционального наследования такого полезного свойства нет; в каждом новом экземпляре свойства и методы будут создаваться заново, то есть дублироваться. Это обстоятельство может представлять проблему, если вы создаете многочисленные экземпляры крупных объектов (возможно, тысячи) и для вас критичен объем потребляемой памяти. Одно из решений такой проблемы — сохранять любые крупные свойства или методы в объекте, а потом передавать этот объект функциям конструктора в качестве аргумента. После этого все экземпляры смогут использовать один и тот же объектный ресурс, не создавая при этом собственных версий объекта.

                        ну как я и предлагал вначале! мля я мля оракл! :D :D
                        Сообщение отредактировано: Cfon -
                          Цитата Cfon @
                          продолжаю забивать в крышку гроба гвозди :blush:

                          Своего гроба? Или чьего, я не понимаю?.. :-?
                            Цитата Астарот @
                            Своего гроба? Или чьего, я не понимаю?.. :-?

                            нет всех тех кто не согласен со мной! :D
                              Цитата Cfon @
                              продолжаю забивать в крышку гроба гвозди
                              на этот раз еще одна цитата из другой хорошей книжки Raffaele Cecco "Supercharged JavaScript Graphics"

                              Можешь открыть функциональное наследование (сообщение #3726885) где я предлагал воспользоваться прототипами (а заодно выкинуть в помойку книгу,
                              где приводились в пример явный фектори, в качестве примера наследования, что, естественно является откровенным бредом), т.к. твоё решение было довольно плохим как раз с точки зрения тобою же приведённой цитаты от другого автора. Очень рад, что ты наконец её выинул и начал читать более адекватные книжки. Осталось совсем чуть-чуть :D

                              А теперь ещё раз напоминаю, что на дворе 2017ый год, и хоть приведённая тобою цитата и верна, но эти подходы были актуальны в то время, когда я ещё в школе учился. :whistle:
                              Сообщение отредактировано: Serafim -
                                Цитата Cfon @
                                Одно из решений такой проблемы — сохранять любые крупные свойства или методы в объекте, а потом передавать этот объект функциям конструктора в качестве аргумента. После этого все экземпляры смогут использовать один и тот же объектный ресурс, не создавая при этом собственных версий объекта.

                                Мы не будем использовать прототипы, вместо этого мы создадим фабрику с непонятно каким поведением, наступим на все грабли, пару раз стрельнем себе в ногу, и получим ровно тоже самое :D Грамотный подход! :D
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0543 ]   [ 18 queries used ]   [ Generated: 26.04.24, 16:20 GMT ]