Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Создание функции вне прототипа (https://javascript.ru/forum/misc/47339-sozdanie-funkcii-vne-prototipa.html)

e41zytp 19.05.2014 18:29

Создание функции вне прототипа
 
Нашел статью http://habrahabr.ru/post/11673/. В ней есть код
function Test(){
        // объявляем и инициализируем свойства
        this.x=5;
        this.y=3;
        // прикручиваем методы
        this.sum=Test_sum;
        // выполняем иные конструктивные действия
        alert("Constructor: x="+this.x+", y="+this.y+", sum="+this.sum());
    }
    
    // реализуем методы
    function Test_sum(){
        return this.x+this.y;
    }

И нище комментарий
Код:

В результате, действительно, функция Test_sum создаётся только один раз, а при каждом конструировании нового объекта Test создаётся только ссылка sum.
В то же время это малограмотный вариант.

Расскажите, чем плох этот код.

nerv_ 19.05.2014 18:39

e41zytp,
1) сам как думаешь?
2) а почитать по ссылке?

e41zytp 19.05.2014 18:50

nerv_, если бы у меня были бы варианты, то я бы указал их.
Нашел только упоминание
Цитата:

Всё можно сделать гораздо красивее и правильнее
Вот и хочу узнать в чем неправильность.

Sweet 19.05.2014 20:02

Цитата:

Сообщение от e41zytp
Расскажите, чем плох этот код.

Тем, что он малограмотный:) Потому что в javascript'е для этого есть прототипы:
function Test() { /* код */ }

// записываешь метод по-джаваскриптовому
Test.prototype.sum = Test_sum;


function Test_sum() { /* код */ }

Sweet 19.05.2014 20:08

e41zytp, статья слишком бородата. Рекомендую ознакомиться с соответствующим разделом учебника.

e41zytp 19.05.2014 20:31

Получается просто так не принято писать, а технической разницы нет?

jsnb 21.05.2014 04:21

Цитата:

Сообщение от e41zytp (Сообщение 312571)
Получается просто так не принято писать, а технической разницы нет?

Техническая разница в том, что при использовании приведенного в стартовом посте кода в каждый объект созданный конструктором Test будет записываться свойство sum, которое ссылается на функцию Test_sum. При использовании же прототипов дополнительных свойств sum в создаваемых объектах не создается, а при обращении они будут браться из прототипа. А если от Test надо будет что-нибудь унаследовать и изменить sum, то при первом варианте придется городить огород с перезаписью или копированием свойств для каждого создаваемого объекта. А при использовании прототипов можно будет просто изменить нужный метод в прототипе потомка.

nerv_ 21.05.2014 11:44

Цитата:

Сообщение от jsnb
Техническая разница в том, что при использовании приведенного в стартовом посте кода в каждый объект созданный конструктором Test будет записываться свойство sum, которое ссылается на функцию Test_sum. При использовании же прототипов дополнительных свойств sum в создаваемых объектах не создается, а при обращении они будут браться из прототипа. А если от Test надо будет что-нибудь унаследовать и изменить sum, то при первом варианте придется городить огород с перезаписью или копированием свойств для каждого создаваемого объекта. А при использовании прототипов можно будет просто изменить нужный метод в прототипе потомка.

скажу проще: не наследуется, жрет больше памяти (применительно к коду из первого поста)


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