|
19.05.2014, 18:29
|
Новичок на форуме
|
|
Регистрация: 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.
В то же время это малограмотный вариант. |
Расскажите, чем плох этот код.
|
|
19.05.2014, 18:39
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
e41zytp,
1) сам как думаешь?
2) а почитать по ссылке?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
19.05.2014, 18:50
|
Новичок на форуме
|
|
Регистрация: 19.05.2014
Сообщений: 3
|
|
nerv_, если бы у меня были бы варианты, то я бы указал их.
Нашел только упоминание
Цитата:
|
Всё можно сделать гораздо красивее и правильнее
|
Вот и хочу узнать в чем неправильность.
|
|
19.05.2014, 20:02
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Сообщение от e41zytp
|
Расскажите, чем плох этот код.
|
Тем, что он малограмотный Потому что в javascript'е для этого есть прототипы:
function Test() { /* код */ }
// записываешь метод по-джаваскриптовому
Test.prototype.sum = Test_sum;
function Test_sum() { /* код */ }
|
|
19.05.2014, 20:08
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
e41zytp, статья слишком бородата. Рекомендую ознакомиться с соответствующим разделом учебника.
|
|
19.05.2014, 20:31
|
Новичок на форуме
|
|
Регистрация: 19.05.2014
Сообщений: 3
|
|
Получается просто так не принято писать, а технической разницы нет?
|
|
21.05.2014, 04:21
|
Профессор
|
|
Регистрация: 15.03.2014
Сообщений: 561
|
|
Сообщение от e41zytp
|
Получается просто так не принято писать, а технической разницы нет?
|
Техническая разница в том, что при использовании приведенного в стартовом посте кода в каждый объект созданный конструктором Test будет записываться свойство sum, которое ссылается на функцию Test_sum. При использовании же прототипов дополнительных свойств sum в создаваемых объектах не создается, а при обращении они будут браться из прототипа. А если от Test надо будет что-нибудь унаследовать и изменить sum, то при первом варианте придется городить огород с перезаписью или копированием свойств для каждого создаваемого объекта. А при использовании прототипов можно будет просто изменить нужный метод в прототипе потомка.
Последний раз редактировалось jsnb, 21.05.2014 в 04:25.
|
|
21.05.2014, 11:44
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от jsnb
|
Техническая разница в том, что при использовании приведенного в стартовом посте кода в каждый объект созданный конструктором Test будет записываться свойство sum, которое ссылается на функцию Test_sum. При использовании же прототипов дополнительных свойств sum в создаваемых объектах не создается, а при обращении они будут браться из прототипа. А если от Test надо будет что-нибудь унаследовать и изменить sum, то при первом варианте придется городить огород с перезаписью или копированием свойств для каждого создаваемого объекта. А при использовании прототипов можно будет просто изменить нужный метод в прототипе потомка.
|
скажу проще: не наследуется, жрет больше памяти (применительно к коду из первого поста)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
|
|