Хватит смешить людей, просто признайте, что вы не знаете JS и не умеете на нем программировать. Чисто формально, метод «класса» в JS — это функция лежащая в прототипе конструктора.
Запись:
obj.handler = function () {}.bind(this)
это просто создание функции выполняющейся в контексте текущего объекта.
Оба примера кода значат одно и то же. То что вы говорите, можно сравнить с утверждением, что англичане не могут понимать, что такое стол, только потому, что называют его «table» а не «стол».
Завязывайте уже с этой бессмыслицей и погуглите, что такое денотационная семантика, например. Возможно вы станете проще относиться к синтаксису языков и глубже понимать их возможности.
Спорить с вами бесполезно, т.к. вы явно не понимаете о чем говорите.
Дам просто хороший совет, поизучайте другие ЯП кроме си-подобных. Советую Smalltalk и Lisp. И книжки по computer science почитайте, например SICP. Конечно если вам интересна тема языков программирования.
Вот я и говорю, не понимаете разницы. А между тем, это серьезное заблуждение. Свойства и возможности языка определяются абстракциями и семантикой конструкций, которые он предоставляет. Когда я пишу код, я думаю не о ключевых словах и операторах, скорее о формальных математический сущностях, которые я описываю, о том что значит мой код. Семантически, JS гораздо ближе к Lisp-подобным языкам (в которых, к слову, синтаксис вообще практически отсутствует и ограничен правилами расстановки скобок, а так же несколькими особыми формами) и думать на нем лучше в функциональной манере, но из-за его внешней си-подобности, JS часто неправильно воспринимается программистами. И остается абсолютно непонятым недопрограммистами, которые думают, что ООП — это наличие слова class в языке.
с этой оберткой еще терпимо можно программировать, и то потому что альтернативы нет
Есть аннотации, которые решают проблему удобства написания кода в IDE. Но вам нужно не эту проблему решать, у вас сложности с фундаментальным представлением о том, что такое программирование.
Вы похоже не понимаете разницу между языком программирования и его синтаксисом, раз говорите, что JS не поддерживает ООП, а TypeScript, по сути являющийся синтаксическим сахором для JS, поддерживает. В языках программирования в основном важна семантика, то есть значение той или иной конструкции языка, а не способ ее записи.
Код на TypeScript:
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
getName() {
return this.name;
}
}
И на JS:
function Person(name) {
this.name = name;
}
Person.prototype.getName = function () {
return this.name;
};
Означает одно и то же на 100%. Просто пишется по-разному. Глупо говорить, что одно ООП, а другое нет.
Зачем вы пишете ерунду, а потом спрашиваете почему ерунда странно работает?
Есть вполне общепринятые соглашения для написания кода и аннотации с поддержкой в IDE. Если вам нужно писать код, то никто не мешает это делать, если троллить на тему того, что на JS при желании можно писать говно, то тут уже другой вопрос…
Вот скрин на тему того как работать с private, protected, public полями в JS. Никаких проблем, варнинги, автокомплит и подсказки по типам, все на месте.
Есть у меня товарищ который любит называть это анонимным методом анонимного объекта :)
Ну а так, да. Такой ответ говорит о том, что с человеком есть о чем говорить.
выражение function () {} синтаксический анализатор не поймет, так как думает, что это объявление функции хотя мы имели в виду создание выражения возвращающего функцию.
! — «унарное не» предполагает, что после него идет выражение, так что все становится хорошо и синтаксической ошибки не происходит :)
можно еще
(function () {})()
или
(function () {}())
написать, результат тот же.
Скопирую сюда некоторые вопросы, которые задаю на собеседовании
1. Напишите функцию inArray проверяющую вхождение элемента в массив и возвращающую значение типа Boolean.
2. Что вернет выражение +new Date()? Чем отличается от Date.now()?
3. Напишите функцию принимающую строку с именем файла и возвращающую расширение (фрагмент после последней точки).
4. Каков будет результат выполнения следующего кода:
for (var i = 0; i < 10; i++) {
setTimeout(function () {
console.log(i);
}, 0);
}
5. Напишите регулярное выражение для проверки строк соответствующих формату даты dd.mm.yyyy.
6. Опишите разницу между операторами == и ===. Когда имеет смысл использовать каждый из вариантов?
Иногда прошу реализовать bind или new ручками. Но если честно, люди, которых имеет смысл об этом просить встречаются не часто, к сожалению…
Иногда, погрузившись в какую-то предметную область, со временем можно обнаружить, что число компаний, в которых ты готов работать, не так уж велико. И по какой-то причине, тебя, в любой из них, хоть кто-то да знает…
Запись:
это просто создание функции выполняющейся в контексте текущего объекта.
Оба примера кода значат одно и то же. То что вы говорите, можно сравнить с утверждением, что англичане не могут понимать, что такое стол, только потому, что называют его «table» а не «стол».
Завязывайте уже с этой бессмыслицей и погуглите, что такое денотационная семантика, например. Возможно вы станете проще относиться к синтаксису языков и глубже понимать их возможности.
Дам просто хороший совет, поизучайте другие ЯП кроме си-подобных. Советую Smalltalk и Lisp. И книжки по computer science почитайте, например SICP. Конечно если вам интересна тема языков программирования.
Вот я и говорю, не понимаете разницы. А между тем, это серьезное заблуждение. Свойства и возможности языка определяются абстракциями и семантикой конструкций, которые он предоставляет. Когда я пишу код, я думаю не о ключевых словах и операторах, скорее о формальных математический сущностях, которые я описываю, о том что значит мой код. Семантически, JS гораздо ближе к Lisp-подобным языкам (в которых, к слову, синтаксис вообще практически отсутствует и ограничен правилами расстановки скобок, а так же несколькими особыми формами) и думать на нем лучше в функциональной манере, но из-за его внешней си-подобности, JS часто неправильно воспринимается программистами. И остается абсолютно непонятым недопрограммистами, которые думают, что ООП — это наличие слова class в языке.
Есть аннотации, которые решают проблему удобства написания кода в IDE. Но вам нужно не эту проблему решать, у вас сложности с фундаментальным представлением о том, что такое программирование.
Код на TypeScript:
И на JS:
Означает одно и то же на 100%. Просто пишется по-разному. Глупо говорить, что одно ООП, а другое нет.
Есть вполне общепринятые соглашения для написания кода и аннотации с поддержкой в IDE. Если вам нужно писать код, то никто не мешает это делать, если троллить на тему того, что на JS при желании можно писать говно, то тут уже другой вопрос…
Вот скрин на тему того как работать с private, protected, public полями в JS. Никаких проблем, варнинги, автокомплит и подсказки по типам, все на месте.
Скрин с ворнингом:
Скрин с пофикшеным кодом:
developers.google.com/closure/compiler/
Ну а так, да. Такой ответ говорит о том, что с человеком есть о чем говорить.
Объясните работу этого кода:
Если человек не понимает что это, и пытается тупо выполнить код в консоли, ему это ни капельки не поможет :)
! — «унарное не» предполагает, что после него идет выражение, так что все становится хорошо и синтаксической ошибки не происходит :)
можно еще
(function () {})()
или
(function () {}())
написать, результат тот же.
В ES5 никак. И это не мешает JS быть ООП языком. С чего вы взяли, что наличие классов — обязательное требование для ООП языка?
1. Напишите функцию inArray проверяющую вхождение элемента в массив и возвращающую значение типа Boolean.
2. Что вернет выражение +new Date()? Чем отличается от Date.now()?
3. Напишите функцию принимающую строку с именем файла и возвращающую расширение (фрагмент после последней точки).
4. Каков будет результат выполнения следующего кода:
5. Напишите регулярное выражение для проверки строк соответствующих формату даты dd.mm.yyyy.
6. Опишите разницу между операторами == и ===. Когда имеет смысл использовать каждый из вариантов?
Иногда прошу реализовать bind или new ручками. Но если честно, люди, которых имеет смысл об этом просить встречаются не часто, к сожалению…
Простой аналог на Haskell (inspired by realworldhaskell):
Кажется компактнее получилось :)
Аналог без частичного применения:
Пробрасывает событие с новой меткой, почему бы и нет…
Кроме того, очень хотелось бы иметь консольный тулчейн отвязанный от эклипса, разрешите разработчику самому выбирать среду разработки.