Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Зачем использовать прототипы в JS? (https://javascript.ru/forum/misc/35542-zachem-ispolzovat-prototipy-v-js.html)

Shitbox2 14.02.2013 06:39

Зачем использовать прототипы в JS?
 
Ну правда? Пользовался, пользовался, так и не понял зачем. Намного проще и понятнее запихать все функции в свою библиотеку как есть. А еще сделать эту функцию jQuery-плагином, если используется эта библиотека
jQuery.fn.myFunc = function (options) {

    this.options = $.extend({
        'opt1': true,
        'opt2': false
    }, options || {});

    functon one () {...}
    functon two () {...}

    return this.each(function () {
        functon subOne () {...}
        functon subTwo () {...}
    });
};
Не понимаю, зачем ребята в том же Бутстрапе извращаются, создают прототип, конструктор, потом все это отдельно заворачивают в jQuery-плагин, где создают экземпляр объекта... Не, кончено допускаю, что могут быть задачи, где использование объектов оправдано... Игры... Но пока ни одного плагина не видел где бы объект был действительно необходим. Зачем их делают тогда?

P.S. Не говоря уже о том, что ко всем элементам объекта приходится обращаться через this...

danik.js 14.02.2013 09:03

А наследование? А зачем для каждого экземпляра копировать все функции? У вас стоит задача по-максимуму забить память пользователя?

Цитата:

Сообщение от Shitbox2
ко всем элементам объекта приходится обращаться через this

Что еще за "элементы" ? Свойства может? А как к ним еще обращаться?
Ну можете писать так если уж сильно прижало:
with (this) {
    prop1 ..
}


И причем тут jQuery? Можно абстрактный пример без левого кода?

megaupload 14.02.2013 10:27

Потому что функцию в прототип ты записываешь один раз и память занимает одну, а доступ к неё есть у всех обьектов как к родной) как к ЯКОБЫ родной.

Shitbox2 14.02.2013 13:19

jQuery потому что все пишут в jQuery и я тоже... На чистом JS ничего толкового днем с огнем не сыщешь.

Ну вот пример... Попытался по-максимуму на чистом JS. На каждое текстовое поле навешивается функция-обработчик для автодополнения $('input').autocomplit();
jQuery.fn.autocomplit = function () {

    //ф-я обработки ввода и вывода подсказки
    function makeBaloon (obj, text) {...}

    //Перебираем все текстовые поля
    for (var i = 0, i < this.length, i++) {
        this[i].onkeydown = function () {
            makeBaloon(this[i], value)
        }
    }
}

И где тут лишняя память расходуется?

danik.js 14.02.2013 13:22

Так а я тут и конструктора не вижу. О каких прототипах речь без конструктора? Есть конструктор = есть экзлемпляры = есть прототип. Тут ничего этого нет и не нужно.

danik.js 14.02.2013 13:25

Цитата:

Сообщение от Shitbox2
все пишут в jQuery и я тоже

Цитата:

Сообщение от Shitbox2
this[i].onkeydown

Это DOM Level 1, древнейший javascript метод навешивания обработчика (в единственном экземпляре, кстати, поэтому ваш скрипт легко может сломать что-нибудь), а не jQuery.

Цитата:

Сообщение от Shitbox2
На чистом JS ничего толкового днем с огнем не сыщешь

Это потому что вы интересуетесь только DOM'ом.

megaupload 14.02.2013 15:27

Цитата:

Сообщение от Shitbox2
И где тут лишняя память расходуется?

ты совсем тупой? тебе сказали что

function Cat(){
    this.ololo = 11;
}


расходует больше памяти чем

function Cat(){}
Cat.prototype.ololo = 11;


По этому используют прототипы. при чем тут жуквери какие то?? тебе ответили на вопрос "зачем использовать прототипы." - ДЛЯ УСТРАНЕНИЯ ИЗБЫТОЧНОСТИ и соответственно уменьшения потребления ресурсов.

Цитата:

Сообщение от Shitbox2
Ну вот пример... Попытался по-максимуму на чистом JS.

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

Shitbox2 15.02.2013 05:32

Ок. Не буду ничего выдумывать. См. https://github.com/twitter/bootstrap...trap-button.js

Из 100 строчек кода половина обвеска. Зачем это все нужно? Зачем там конструкторы и прототипы? И почему без них будет избыточность?

danik.js 15.02.2013 05:39

Цитата:

Сообщение от Shitbox2
Зачем это все нужно?

А ты попробуй без всего этого написать такой же по функционалу плагин и поймешь. А если не поймешь - объясним. Дай знать когда напишешь код.

kobezzza 15.02.2013 11:16

Shitbox2, со временем поймёшь.

ЗЫ: по ссылке, если не использовать прототипы, то в случае, когда на странице много кнопок могут быть проблемы, т.к. каждая кнопка будет жрать кучу лишней памяти.

danik.js 15.02.2013 11:30

Shitbox2, впринципе можно как ты показал, только функции создавать чуть выше, один раз. А так они создаются всякий раз при вызове myFunc. Но тогда придется всякий раз выставлять им нужный this - еще все запутанней получится. Так что у разрабов bootstrap вполне нормальный подход...

nerv_ 15.02.2013 11:56

Цитата:

Сообщение от Shitbox2
И где тут лишняя память расходуется?

this[i].onkeydown = function () {


Цитата:

Сообщение от Shitbox2

ребята жгут
var $btn = $(e.target)
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
$btn.button('toggle')

megaupload 15.02.2013 12:30

Shitbox2,
http://learn.javascript.ru/prototype

9xakep 15.02.2013 22:23

что означает запись: !function ?

nerv_ 15.02.2013 23:18

Цитата:

Сообщение от 9xakep
что означает запись: !function ?

тоже, что и
+function() {

дает интерпритатору понять, то это function expression

9xakep 16.02.2013 22:33

nerv_,
Спасибо

megaupload 16.02.2013 23:38

Цитата:

Сообщение от nerv_
тоже, что и
+function() {

охренеть людям скобочки уже лень писать)))


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