Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.133.108.241] |
|
Страницы: (11) « Первая ... 5 6 [7] 8 9 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#91
,
|
|
|
Ага, только не понятно на что ты отвечаешь, всего-то. |
Сообщ.
#92
,
|
|
|
Цитата Serafim @ Ты лет на 5 отстал от жизни. Подсказываю, открываешь консоль в хроме и пишешь `class VJSNetClassovYaTochnoUveren {}` возможно но не в программировании |
Сообщ.
#93
,
|
|
|
Serafim, оставь его в покое, не видишь что ли, человек прется с прототипной системы, ему кажется, что он познал дзен и ИСТИНУ Наиграется, пару раз споткнется о цепочку наследования, о потерянный контекст и прочие прелести - и тут же полюбит весь сахар
|
Сообщ.
#94
,
|
|
|
т.е. ты мне не веришь? да и пох! |
Сообщ.
#95
,
|
|
|
Cfon, а ты знаешь, что помимо protype ещё есть __proto__?
Скрытый текст fatality :troll: |
Сообщ.
#96
,
|
|
|
Цитата Serafim @ Cfon, а ты знаешь, что помимо protype ещё есть __proto__? да знаю, оно позволяет получить доступ к прототипу объекта, как правило его не следует юзать, лучше функцию Object.getPrototypeOf() Добавлено Цитата Астарот @ Наиграется, пару раз споткнется о цепочку наследования, о потерянный контекст и прочие прелести - и тут же полюбит весь сахар врядли я не собираюсь юзать наследование на практике, его в JS я изучаю просто для полноты картины языка и проверки его средств если есть примерчик того где я могу заблудиться в контекстах велком, буду рад размять кости |
Сообщ.
#97
,
|
|
|
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); Развлекайся |
Сообщ.
#98
,
|
|
|
Цитата Serafim @ Скрытый текст 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); легко во-первых, так нельзя писать на JS в случае записи литералом, прототип объекта не доступен! разве что __proto__, но это свойство не везде реализовано, можно через Object.getPrototypeOf(), но тогда незабываем что методы будут добавлятся к Object.prototype. правильно надо так: // фукнция-конструктор var Some = function () {}; Some.prototype.alert = function (message) { console.log(message); } Some.prototype.todo = function () { this.alert('This is a message every 1 second'); } или так // объект-литерал var some = { alert: function (message) { console.log(message); }, todo: function () { this.alert('This is a message every 1 second'); } }; во-вторых, в setInterval ты передаешь функцию без контекстом вызова, точнее с глобальным контектом, в случае броузера это объект window, как быть? все просто надо его привязать след образом: var some = new Some(); setInterval(some.todo.bind(some), 1000); или setInterval(some.todo.bind(some), 1000); еще примеры |
Сообщ.
#99
,
|
|
|
ну да, там функция должна быть, очепятался
|
Сообщ.
#100
,
|
|
|
шо все больше нет примеров?
лана не суть так протестировал я тут еще один вариант, с привязкой методов // 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 и зерите скока памяти жрут объекты в хипе. ВСЕ! Прикреплённый файлtests.rar (1,72 Кбайт, скачиваний: 145) да еще анализируя результаты в Хроме, заметил что в первом случае раздел system/Context занимает ~10,000 объектов при тесте 10,000 объектов, а вот во втором с привязкой всего 125 объектов, видимо в этом есть ответ на вопрос. |
Сообщ.
#101
,
|
|
|
продолжаю забивать в крышку гроба гвозди
на этот раз еще одна цитата из другой хорошей книжки Raffaele Cecco "Supercharged JavaScript Graphics" Цитата Глава 1. Многократное использование кода и его оптимизация Одно из достоинств использования наследования через прототипы заключается в эффективном применении памяти; свойства и методы прототипа объекта сохраняются лишь однажды, независимо от того, сколько раз от них происходит наследование. У функционального наследования такого полезного свойства нет; в каждом новом экземпляре свойства и методы будут создаваться заново, то есть дублироваться. Это обстоятельство может представлять проблему, если вы создаете многочисленные экземпляры крупных объектов (возможно, тысячи) и для вас критичен объем потребляемой памяти. Одно из решений такой проблемы — сохранять любые крупные свойства или методы в объекте, а потом передавать этот объект функциям конструктора в качестве аргумента. После этого все экземпляры смогут использовать один и тот же объектный ресурс, не создавая при этом собственных версий объекта. ну как я и предлагал вначале! мля я мля оракл! |
Сообщ.
#102
,
|
|
|
Цитата Cfon @ продолжаю забивать в крышку гроба гвозди Своего гроба? Или чьего, я не понимаю?.. |
Сообщ.
#103
,
|
|
|
Цитата Астарот @ Своего гроба? Или чьего, я не понимаю?.. нет всех тех кто не согласен со мной! |
Сообщ.
#104
,
|
|
|
Цитата Cfon @ продолжаю забивать в крышку гроба гвозди на этот раз еще одна цитата из другой хорошей книжки Raffaele Cecco "Supercharged JavaScript Graphics" Можешь открыть функциональное наследование (сообщение #3726885) где я предлагал воспользоваться прототипами (а заодно выкинуть в помойку книгу, где приводились в пример явный фектори, в качестве примера наследования, что, естественно является откровенным бредом), т.к. твоё решение было довольно плохим как раз с точки зрения тобою же приведённой цитаты от другого автора. Очень рад, что ты наконец её выинул и начал читать более адекватные книжки. Осталось совсем чуть-чуть А теперь ещё раз напоминаю, что на дворе 2017ый год, и хоть приведённая тобою цитата и верна, но эти подходы были актуальны в то время, когда я ещё в школе учился. |
Сообщ.
#105
,
|
|
|
Цитата Cfon @ Одно из решений такой проблемы — сохранять любые крупные свойства или методы в объекте, а потом передавать этот объект функциям конструктора в качестве аргумента. После этого все экземпляры смогут использовать один и тот же объектный ресурс, не создавая при этом собственных версий объекта. Мы не будем использовать прототипы, вместо этого мы создадим фабрику с непонятно каким поведением, наступим на все грабли, пару раз стрельнем себе в ногу, и получим ровно тоже самое Грамотный подход! |