All streams
Search
Write a publication
Pull to refresh
61
0
David Klassen @f0rk

Программист

Send message
Хватит смешить людей, просто признайте, что вы не знаете 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 () {}).call({})


Если человек не понимает что это, и пытается тупо выполнить код в консоли, ему это ни капельки не поможет :)
выражение function () {} синтаксический анализатор не поймет, так как думает, что это объявление функции хотя мы имели в виду создание выражения возвращающего функцию.
! — «унарное не» предполагает, что после него идет выражение, так что все становится хорошо и синтаксической ошибки не происходит :)

можно еще
(function () {})()
или
(function () {}())
написать, результат тот же.
Что-то мне подсказывает, что на собеседовании, где сложность вопросов идет по нарастающей, автор коммента вряд ли добрался бы до вопросов по ООП.
Я бы хотел услышать как в JS описать класс :)

В ES5 никак. И это не мешает JS быть ООП языком. С чего вы взяли, что наличие классов — обязательное требование для ООП языка?
Скопирую сюда некоторые вопросы, которые задаю на собеседовании

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 ручками. Но если честно, люди, которых имеет смысл об этом просить встречаются не часто, к сожалению…
Хмм…
Простой аналог на Haskell (inspired by realworldhaskell):

import Data.Char
import Data.List (intercalate)
        
data JValue = JString String
            | JNumber Double
            | JBool Bool
            | JNull
            | JObject [(String, JValue)]
            | JArray [JValue]
              deriving Show

renderJValue :: JValue -> String
renderJValue (JString s)   = show s
renderJValue (JNumber n)   = show n
renderJValue (JBool True)  = "true"
renderJValue (JBool False) = "false"
renderJValue JNull         = "null"
renderJValue (JObject o) = "{" ++ pairs o ++ "}"
    where pairs [] = ""
          pairs ps = intercalate ", " (map renderPair ps)
          renderPair (k, v) = show k ++ ": " ++ renderJValue v
renderJValue (JArray a) = "[" ++ values a ++ "]"
    where values [] = ""
          values vs = intercalate ", " (map renderJValue vs)
    
main = putStrLn $ renderJValue (JObject [
        ("Comment", JString "My comment"), 
        ("Count", JNumber 10),
        ("DiskParam", JObject [
            ("DB", JNumber 10), 
            ("DBAngle", JNumber 1.234)
        ]),
        ("Range", JBool True),
        ("Blades", JArray $ map (\ch -> 
            JObject [
                ("Caption", JString (ch:[])),
                ("Value", JNumber (fromIntegral (ord ch)))
            ])  ['A'..'C']),
        ("Slots", JArray [JNumber 0, JNumber 1, JNumber 2])
    ])


Кажется компактнее получилось :)
Иногда, погрузившись в какую-то предметную область, со временем можно обнаружить, что число компаний, в которых ты готов работать, не так уж велико. И по какой-то причине, тебя, в любой из них, хоть кто-то да знает…
Частичное применение вполне полезный прием, когда понимаешь как работает. Вот пример из живого проекта:

cas.on(cas.EVENT_CA_EXTENDED_MESSAGE, ui.emit.bind(ui, ui.EVENT_SHOW_POPUP));


Аналог без частичного применения:

cas.on(cas.EVENT_CA_EXTENDED_MESSAGE, function (message) {
  ui.emit(ui.EVENT_SHOW_POPUP, message);
});


Пробрасывает событие с новой меткой, почему бы и нет…
небольшой апгрейд :)

var sum = function (args) {
  return Array.prototype.slice.call(args).reduce(function (m, el) { return m + el; }, 0);
};

var add = function () {
  var orig = sum(arguments);
  var inner = function () {
    var val = sum(arguments);
    
    return add((+val || 0) + (+orig || 0));
  };
  inner.valueOf = function () {return +orig || 0;};

  return inner;
};

assert.equal(add(2, 0)(3), 5);
Не очень понял про «приложение для смартфона под управлением Tizen с поддержкой Samsung Gear 2». Tizen на телефонах уже поддерживает SAP?
у standalone-приложений нет интернета
Mac OS X 10.9

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

Information

Rating
Does not participate
Location
Таиланд
Date of birth
Registered
Activity

Specialization

Backend Developer, Software Architect
Lead
From 12,000 $