LINUX.ORG.RU

[js] Что делать, чтобы не было путаницы с this в роли контекста и в роли создаваемого объекта?

 


0

2

А то получается, что в некоторых методах нужно, чтобы this указывало на объект, а оно указывает на всякий мусор.

★★★★★

Последнее исправление: sphericalhorse (всего исправлений: 1)
Ответ на: комментарий от zz
man инкапсуляцыя

Хотя уже не важно, ибо я написал, по сути, @__a. Если интересно — пишу клиентский генератор веб-форм с валидаторами. Чуть позже репозиторий обновлю (http://github.com/sphericalhorse/spform).

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от sphericalhorse

man инкапсуляцыя

Тот, кто использует то, чего нет в доках - ССЗБ.

Если интересно — пишу клиентский генератор веб-форм с валидаторами

Заводи топик или пингуй тут как оно будет доступно - с удовольствием посмотрю. Cам велосипедил несколько раз :). html5 аттрибуты будут?

zz ★★★★
()
Ответ на: комментарий от zz

html5 аттрибуты будут?

Нет. Только ИЕ, только хардкор.

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от geekless

Ты действительно хочешь услышать тут пересказ всех недостатков JS?

Да.

Может быть, просто погуглишь?

А может, все таки, обоснуешь свои выбросы?

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от sphericalhorse

Автоматическое приведение типов в сочетании с использованием операции + для конкатенации («3» + «1» == «31»; «3» - «1» == «2»), нелепые правила сравнения и приведения типов ([17] == 17; [0] == [0] && [0] == ![0]), различие undefined и null (ох уж этот null; typeof null == object, null is Object == false — всё просто и понятно!), необходимость var для работы с локальными переменными, необходимость явно указывать this, идиотский многословный способ инициализации объектов, необходимость 100500 раз писать кейворды function и return вместо какого-нибудь нормального способа объявления лямбд, «хэш-таблицы», которые на самом деле не хэш-таблицы (hash_table = {}; 'constructor' in hash_table == true; костыль Object.prototype.hasOwnProperty.call к вашим услугам — энтерпрайзно, надёжно; ну как тут не процитировать замечательного человека: «Конструкцией {} вы создаёте не хеш таблицу, а Object. Конструкцией Object.create(null) вы создаёте хеш-таблицу. Действительно, ничего удивительного!»), отсутствие модульности, бедность (а до некоторого времени, фактически, полная беспомощность) стандартной библиотеки типов, отсутствие гомоиконности (я считаю, эпик фейл для языка, изначально заточенного на работу в браузере) и одновременно с этим — динамическая прототипная система, ставящая серьёзный предел возможностям оптимизации кода интепретатором (тут уж надо или крестик снять, или штаны надеть — или мы делаем универсальный и удобный язык, или быстрый и эффективно оптимизируемый; получился же двойной фейл)... и так далее, и так далее. Нет ни одной части языка, где бы он не был зафейлен на уровне базовых концепций, так что перечислять можно долго. В целом же: многословность синтаксиса, бедность выразительных средств, неочевидная семантика, при которой каждый элемент языка делает не то, что должен, а то, что получилось.

Но если тебя всё еще коробит определение убогонький недоязычок, можно выразиться иначе:

ЯЗЫК ДЛЯ ВЫПАДАЮЩИХ МЕНЮШЕК.

geekless ★★
()
Ответ на: комментарий от geekless

Автоматическое приведение типов в сочетании с использованием операции + для конкатенации («3» + «1» == «31»; «3» - «1» == «2»), нелепые правила сравнения и приведения типов ([17] == 17; [0] == [0] && [0] == ![0]), различие undefined и null (ох уж этот null; typeof null == object, null is Object == false — всё просто и понятно!)

Согласен, но и тут иногда можно выгоду иметь.


необходимость var для работы с локальными переменными,

Аргумент неосиляторов.


необходимость явно указывать this, идиотский многословный способ инициализации объектов, необходимость 100500 раз писать кейворды function и return вместо какого-нибудь нормального способа объявления лямбд, «хэш-таблицы», которые на самом деле не хэш-таблицы (hash_table = {}; 'constructor' in hash_table == true; костыль Object.prototype.hasOwnProperty.call к вашим услугам — энтерпрайзно, надёжно; ну как тут не процитировать замечательного человека: «Конструкцией {} вы создаёте не хеш таблицу, а Object. Конструкцией Object.create(null) вы создаёте хеш-таблицу. Действительно, ничего удивительного!»)

Вполне нормальные поведение. Как ни как прототипный ООП язык. Если научиться этим всем правильно пользоваться, то становиться весьма приятно писать.
То что при создании хеш таблицы через {} она имеет дополнительные скрытые свойства и методя для работы с ней же не так критично.

отсутствие модульности

Проблема реализации JS в браузерах, но не языка в общем.


бедность (а до некоторого времени, фактически, полная беспомощность) стандартной библиотеки типов

Как-то не почувствовал.


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

Тут не могу сказать, ибо о гомоиконности знаю не много.


и одновременно с этим — динамическая прототипная система, ставящая серьёзный предел возможностям оптимизации кода интепретатором (тут уж надо или крестик снять, или штаны надеть — или мы делаем универсальный и удобный язык, или быстрый и эффективно оптимизируемый; получился же двойной фейл)...

Может и так, но на деле тот же V8 работает очень даже не плохо.


Нет ни одной части языка, где бы он не был зафейлен на уровне базовых концепций

Опять же, к ним просто привыкнуть нужно.


ЯЗЫК ДЛЯ ВЫПАДАЮЩИХ МЕНЮШЕК.

А это просто очень толсто.


Мой основной аргумент в том, что прототипная система в языке очень прекрасна (если её осилить).


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

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от sphericalhorse

иногда можно выгоду иметь

Тут можно только грабли иметь.

Аргумент неосиляторов.

Да-да, осиляторы каждый день вместо зарядки вбивают по 100500 ненужных кейвордов и гордятся этим. И ладно бы это несло какой-то смысл, так ведь это тупо ошибка дизайна.

Вполне нормальные поведение. Как ни как прототипный ООП язык. Если научиться этим всем правильно пользоваться, то становиться весьма приятно писать.

Я же говорил, синдром утенка. Правильно я netcat-а отговаривал давать школьникам Си. С JS та же история: научиваются вот на таких костылях, а потом считают это фичами языка или концепции. Какое отношение отсутствие в языке хэш-контейнера имеет к прототипам? Правильно, никакого.

> Нет ни одной части языка, где бы он не был зафейлен на уровне базовых концепций

Опять же, к ним просто привыкнуть нужно.

Надо привыкнуть к фейлам. Ок, очень откровенная и честная мысль. Иначе на этом языке писать не получится.

Мой основной аргумент в том, что прототипная система в языке очень прекрасна (если её осилить).

Прототипная система там ужасна. Как и прочие области языка. Если хочешь посмотреть на язык с нормальной реализацией прототипов, я тебе уже говорил, cмотри Io.

geekless ★★
()
Ответ на: комментарий от PolarFox

JS — не язык, а браузерный ассемблер.

Только вот производительность чуток не дотягивает до ассемблера.

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от sphericalhorse

Что такое коффескрипт не знаю, но вроде это транслятор. Суть та же — прячем убогую платформу внутрь, поглубже.

PolarFox ★★★★★
()
Ответ на: комментарий от geekless

А какая в этом отношении разница меджду С и Python? Костыли есть и там и там.

netcat ★★
()

js
Что делать, чтобы не было путаницы с this в роли контекста и в роли создаваемого объекта?

/0 В этом весь js.

mopsene ★★★
()
Ответ на: комментарий от geekless

ППКС, сейчас вплотную столкнулся с php и js, более убогих недоязыков свет не видывал.

mopsene ★★★
()
26 мая 2012 г.
Ответ на: комментарий от geekless

Прототипная система там ужасна. Как и прочие области языка. Если хочешь посмотреть на язык с нормальной реализацией прототипов, я тебе уже говорил, cмотри Io.

А Lua считается?

sphericalhorse ★★★★★
() автор топика
Ответ на: комментарий от geekless

так ведь это тупо ошибка дизайна.

Тогда ты хреново разбираешься в дизайне языков. Языки без конструкций определения переменных страдают global - херней, что еще хуже. Проблема в JS - это то что можно _без var_ объявить переменную (не в strict) + при том что у них есть нормальное определение переменных они умудряются лажануться и не ограничить область жизни переменной текущим блоком.

а потом считают это фичами языка или концепции.

Именно так. Прототипная система - это круто, только в JS ее оставили в зачаточном состоянии и она выглядит уродски. Эх, если бы они ее продумали нормально, ведь Self уже существовал.

Нет ни одной части языка, где бы он не был зафейлен на уровне базовых

концепций

Как раз самые базовые концепции у него вполне ничего. Только вот построен на основе этих концепций достаточно непотребный язык.

theos ★★★
()

Тред не читал

var scope = this;
function blah() {
    scope.someMethod();
}

Если я правильно тебя понял.

jessey
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.