Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.05.2014, 18:29
Новичок на форуме
Отправить личное сообщение для e41zytp Посмотреть профиль Найти все сообщения от e41zytp
 
Регистрация: 19.05.2014
Сообщений: 3

Создание функции вне прототипа
Нашел статью 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.
В то же время это малограмотный вариант.
Расскажите, чем плох этот код.
Ответить с цитированием
  #2 (permalink)  
Старый 19.05.2014, 18:39
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

e41zytp,
1) сам как думаешь?
2) а почитать по ссылке?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #3 (permalink)  
Старый 19.05.2014, 18:50
Новичок на форуме
Отправить личное сообщение для e41zytp Посмотреть профиль Найти все сообщения от e41zytp
 
Регистрация: 19.05.2014
Сообщений: 3

nerv_, если бы у меня были бы варианты, то я бы указал их.
Нашел только упоминание
Цитата:
Всё можно сделать гораздо красивее и правильнее
Вот и хочу узнать в чем неправильность.
Ответить с цитированием
  #4 (permalink)  
Старый 19.05.2014, 20:02
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

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

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


function Test_sum() { /* код */ }
Ответить с цитированием
  #5 (permalink)  
Старый 19.05.2014, 20:08
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

e41zytp, статья слишком бородата. Рекомендую ознакомиться с соответствующим разделом учебника.
Ответить с цитированием
  #6 (permalink)  
Старый 19.05.2014, 20:31
Новичок на форуме
Отправить личное сообщение для e41zytp Посмотреть профиль Найти все сообщения от e41zytp
 
Регистрация: 19.05.2014
Сообщений: 3

Получается просто так не принято писать, а технической разницы нет?
Ответить с цитированием
  #7 (permalink)  
Старый 21.05.2014, 04:21
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

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

Последний раз редактировалось jsnb, 21.05.2014 в 04:25.
Ответить с цитированием
  #8 (permalink)  
Старый 21.05.2014, 11:44
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение прототипа функции tsigel Общие вопросы Javascript 11 15.05.2014 01:03
Создание прототипа функции Chiz Events/DOM/Window 8 30.10.2013 22:31
Создание функции realpoc Ваши сайты и скрипты 1 07.08.2013 23:36
Создание примитива с таким же именем как у уже существующего свойства функции lancer Общие вопросы Javascript 7 29.07.2013 20:23
Вызов функции вне html объекта arwprod jQuery 25 05.10.2010 00:14