Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 02.12.2013, 02:34
Аспирант
Отправить личное сообщение для Antonius Посмотреть профиль Найти все сообщения от Antonius
 
Регистрация: 30.11.2013
Сообщений: 42

Сообщение от nerv_ Посмотреть сообщение
Прототипы + соглашения + обертка для new. С другой стороны смотря для кого пишешь - можно и не оборачивать new. Тот, кто используют приватные методы извне - сам дурак
Ну если бы только сам использовал — не парился бы насчет new, а если все-таки опубликую — надо будет или обертку самому добавить, или в инструкции описать. Сам добавлять почему не хочу — во-первых это лишний элемент в пространстве имен, помимо самого конструктора, а во-вторых (и это главное) не могу придумать имя, которое бы было коротким, понятным, и при этом не было похоже на типичное имя переменной, которая уже может быть в проекте. Поэтому пусть сами имя назначают
Ответить с цитированием
  #12 (permalink)  
Старый 02.12.2013, 02:35
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Antonius
во-первых это лишний элемент в пространстве имен, помимо самого конструктора, а во-вторых (и это главное) не могу придумать имя, которое бы было коротким, понятным, и при этом не было похоже на типичное имя переменной
var obj = Constructor.create(params);

Constructor.create = function(params) {
    return new Constructor(params);
};
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 02.12.2013 в 02:39.
Ответить с цитированием
  #13 (permalink)  
Старый 02.12.2013, 02:36
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от nerv_ Посмотреть сообщение
Тот, кто используют приватные методы извне - сам дурак
золотые слова

К слову, если очень нужно запретить изменение метода, то можно использовать "заморозку" (seal, freeze, preventExtensions), но не понимаю зачем, ибо если челочек осмысленно юзает приватные методы извне, то он априори не прав.
__________________
kobezzza
code monkey
Ответить с цитированием
  #14 (permalink)  
Старый 02.12.2013, 02:50
Аспирант
Отправить личное сообщение для Antonius Посмотреть профиль Найти все сообщения от Antonius
 
Регистрация: 30.11.2013
Сообщений: 42

Насчет того, как принято в JS, кажется начинаю понимать
В принципе некоторый опыт с другими языками (в том числе ООП) был, но давно. И по сравнению с ними в JS все как-то непривычно, кажется, надо просто понять, что «тут это нормально».

Кстати, где можно почитать насчет seal, freeze, preventExtensions и т. д. Использовать здесь точно не буду, просто чтобы быть в курсе...


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

Если бы объекты создавались редко, а затем интенсивно модифицировались — можно было бы и так, но пока мне кажется, что именно для этой задачи — не очень красивый вариант.

Последний раз редактировалось Antonius, 02.12.2013 в 02:57.
Ответить с цитированием
  #15 (permalink)  
Старый 02.12.2013, 11:56
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Antonius
Кстати, где можно почитать насчет seal, freeze, preventExtensions и т. д. Использовать здесь точно не буду, просто чтобы быть в курсе...
http://learn.javascript.ru/descriptors-getters-setters

Сообщение от Antonius
Если бы объекты создавались редко, а затем интенсивно модифицировались — можно было бы и так, но пока мне кажется, что именно для этой задачи — не очень красивый вариант.
можешь использовать "Шаблоны принудительного использования new":
1.
'use strict';

function Waffle() {
    alert(this === undefined);
    this.tastes = 'yummy';
}

new Waffle();
Waffle();

В строгом режиме ES5 ссылка this больше не указывает на глобальный объ-
ект.
2.Возвращать из конструктора "другой" объект:
function Waffle() {
    var obj = Object.create(Waffle.prototype);
    obj.tastes = 'yummy';
    alert(obj instanceof Waffle);
    return obj; 
}
new Waffle();
Waffle();

3.Использовать конструктор вызывающий сам себя:
function Waffle() {
    if (!(this instanceof Waffle)) {
        return new Waffle();
    }
    this.tastes = 'yummy';
    alert(this instanceof Waffle);
}
new Waffle();
Waffle();


*писал на скорую руку, мог ошибиться...
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 02.12.2013 в 15:41.
Ответить с цитированием
  #16 (permalink)  
Старый 02.12.2013, 13:22
Профессор
Посмотреть профиль Найти все сообщения от Maxmaxmaximus3
 
Регистрация: 18.11.2013
Сообщений: 275

Сообщение от nerv_
В строгом режиме ES5 ссылка this больше не указывает на глобальный объ-
ект.
в смысле при вызове любой функции всегда создается Object.create(func.prototype) ????
Ответить с цитированием
  #17 (permalink)  
Старый 02.12.2013, 14:49
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от Maxmaxmaximus3 Посмотреть сообщение
в смысле при вызове любой функции всегда создается Object.create(func.prototype) ????
Если у функции не указан объект вызова, то он равен undefined (вместо window как раньше было)
__________________
kobezzza
code monkey
Ответить с цитированием
  #18 (permalink)  
Старый 02.12.2013, 17:08
Аспирант
Отправить личное сообщение для Antonius Посмотреть профиль Найти все сообщения от Antonius
 
Регистрация: 30.11.2013
Сообщений: 42

nerv_, спасибо Первый способ не подходит, поскольку требует обязательного использования "use strict", но на будущее буду иметь в виду. Остальные — интересно.

Все-таки учиться только самостоятельно по источникам в учебниках, литературе не так эффективно, вот даже по простым вопросам общение с более опытными разработчиками сразу приносит ощутимую пользу.
Ответить с цитированием
  #19 (permalink)  
Старый 09.12.2013, 06:53
Аспирант
Отправить личное сообщение для Antonius Посмотреть профиль Найти все сообщения от Antonius
 
Регистрация: 30.11.2013
Сообщений: 42

Пожалуй, придется поднять тему снова

Возник такой вопрос (опять же из разряда «как принято поступать в таких случаях»). Опять же не знаю, пригодится оно мне в итоге или нет, но разобраться в любом случае хочется.

В корневом объекте, который объявлен в скрипте, есть поля, в свою очередь хранящие структурированную информацию. Например, координаты
{ x: 1, y: 2}
. Сейчас, чтобы проверить, что там действительно находятся координаты, иногда приходится использовать проверки типа
if (this.coord && typeof this.coord.x == 'number' && typeof this.coord.y == 'number') {…}

Например, если данные получены извне и еще не провалидированы.

Есть мысль объявить для таких объектов конструкторы и проверять
if (this.coord instanceof Coord) {…}

Валидировать можно при инициализации объекта, например.

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

Пока приходит в голову только объявлять конструкторы как LibraryRoot.Coord, но что-то меня смущает в этом варианте. Собственно, вопрос, нормально ли это или есть способы получше?
Ответить с цитированием
  #20 (permalink)  
Старый 09.12.2013, 08:16
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

LibraryRoot.Coord. Нормально, много так где сделано.
__________________
kobezzza
code monkey
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
скрыть из исходного кода часть javascript кода. javasc Javascript под браузер 10 12.03.2014 09:32
Организация кода function Учебные материалы 4 26.02.2013 19:38
Пример кода сохранения в базу html страницы генерированного посредством JavaScripts wayzer Серверные языки и технологии 2 06.09.2012 16:46
"удобно читаемая" организация кода в js igrok Общие вопросы Javascript 4 22.12.2011 05:08
Грамотная организация кода trasher Общие вопросы Javascript 10 04.02.2010 16:26