Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   прототип объекта (https://javascript.ru/forum/events/55080-prototip-obekta.html)

Tecvid 13.04.2015 12:04

прототип объекта
 
создание прототипа это лучше или хуже, если можно обходиться и без него? как дружит он с памятью? ну например, самый банальный пример:

// обычная функция
function doSmth(elem, argument) {
    // if (elem bla bla) return argument bla bla
}

// и прототип
HTMLElement.prototype.doSmth = function (argument) {
    // if (this bla bla) return argument bla bla
}


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

Brutus 13.04.2015 14:15

Разумеется процедурный вариант быстрее, но разницу в скорости трудно заметить и замерить, и ООП гораздо удобнее и понятнее и лучше конечно в данном случае юзать прототип, если тебя не заботит ie и старомобильные браузеры, jQuery и прочие работают с объектом оберткой, но как мне кажется это слишком грузно

Tecvid 13.04.2015 14:47

понятно, спасибо, а вот насколько старые? симбиан и прочее, или даже старые андроид и ios?

ие не заботит ниже 8 включительно :)

Tecvid 13.04.2015 14:49

jQuery и прочие по моему так делают для вызова методов по цепочке, а в чистом js если не ошибаюсь такого нет, только свойства идут цепочкой

MallSerg 13.04.2015 14:58

Наложить своего кода в прототипы это плохо. Это грабли которые со временем стукнут по носу. Инкапсуляция и наследование это хорошо. Изменять стандартные или чужие объекты это плохо.
В данном случае когда расширяется HTMLelement это плохо для всех наследников этого объекта и далеко не всем наследникам нужно такое свойство.
Лучше создать свой объект в котором реализовать все нужные свойства и методы и добавить его в цепочку прототипов.

Tecvid 13.04.2015 15:00

хмм вот как, спасибо большое, благодарю

Brutus 13.04.2015 15:08

Андроид любой тянет, а вот Opera Mini нет, да она уже и не нужна
Цитата:

Сообщение от Tecvid
jQuery и прочие по моему так делают для вызова методов по цепочке, а в чистом js если не ошибаюсь такого нет, только свойства идут цепочкой

Вот тебе простейший пример обертки
<html>
<head>
<script>
function Dollar (elem) {
    return new ELEMENT(elem);
}

function ELEMENT(element) {
    this.element = element;
}
ELEMENT.prototype = {
    hasClass : function (className) {
        return new RegExp('(\\s|^)'+className+'(\\s|$)').test(this.element.className);
    },
    addClass : function (className) {
        if (!this.hasClass(className))
            this.element.className += (this.element.className ? ' ' : '') +className; 
        return this;
    },
    removeClass : function (className) {
        if (this.hasClass(className))
            this.element.className=this.element.className.replace(new RegExp('(\\s|^)'+className+'(\\s|$)'),' ').replace(/^\s+|\s+$/g, '');
        return this;
    },
}

</script>
</head>
<body>



<script>
Dollar(document.body).addClass('xbody');
Dollar(document.body).removeClass('xbody');
Dollar(document.body).addClass('xybody');

alert(document.body.className+' '+Dollar(document.body).hasClass('xybody'));
</script>
</body>
</html>


Здесь обертка это функция ELEMENT

Но не поддавайся соблазну ;)

Brutus 13.04.2015 15:18

MallSerg,
Но например в случае с функцией addClass это весьма удобно, и нужно почти всем наследникам

Tecvid 13.04.2015 15:20

Цитата:

Сообщение от Brutus
Но не поддавайся соблазну

не поддамся :)
а ваш пример этот то что MallSerg сказал? если нет, то можно примерчик? :)
Цитата:

Сообщение от MallSerg
Лучше создать свой объект в котором реализовать все нужные свойства и методы и добавить его в цепочку прототипов.


Brutus 13.04.2015 15:39

Tecvid,
Мой пример с конструктором или оберткой как в jQuery

Я пока не имею полное представление об объектной модели js я скорее C программист, и пока только учусь в свободное время (1-ый курс) и смысл фразы

"Лучше создать свой объект в котором реализовать все нужные свойства и методы и добавить его в цепочку прототипов." для меня не совсем понятен так что MallSerg если тебе не трудно объясни.


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