Задать вопрос
  • Можно ли использовать npm пакеты по стороне front end?

    imko
    @imko
    Senior Scratch Developer
    Нет, для фронта ноду ты используешь для разработки - для препроцессоров, линтеров, минификаторов и т.д.
    Ответ написан
    Комментировать
  • Какая функциональная разница между этими подходами создания объектов в JS?

    VoidVolker
    @VoidVolker Куратор тега JavaScript
    Dark side eye. А у нас печеньки! А у вас?
    Функционально - разницы никакой, т.к. по факту и то и другое реализует одинаковую логику: создание объекта с определенными свойствами. Третий вариант можно назвать функциональным подходом: мы создаем функцию, которая решает свою задачу и не привязываем её к какому-то классу. `new` - просто способ сказать как компилятору, что надо вызвать функцию-конструктор такого-то класса, так и программисту, читающему данный код в будущем, что вот тут мы создаем новый экземпляр такого-то класса. Так же и, например, {} просто упрощенная запись new Object() для создания объекта.
    Ответ написан
  • Какая функциональная разница между этими подходами создания объектов в JS?

    Xuxicheta
    @Xuxicheta
    инженер
    допустим User это функция-конструктор, или класс.
    user = new User()

    будет создан объект, у которого есть свойство __proto__ в котором лежит объект, состоящий из одного свойства constructor, которая и есть ваша функция User. (Ну типа такой { constuctor: User }. Если писать через class то мы конструктор явно прям зададим. )
    Этот же объект лежит по адресу User.prototype, т.е.
    user.__proto__ === User.prototype
    Этот объект создается для любой объявленной функции (вообще не обязан, но в V8 вроде так), и например User.prototype.constructor === User

    Что такое метод класса, это функция по адресу User.prototype.sayHi (оно же лежит в user.__proto__.sayHi)
    Потом, когда мы пишем user.sayHi js проходит по цепочке из свойств __proto__ и ищет там эту функцию, вызывает ее и передает в качестве контекста (this) наш объект user.

    А теперь посмотрим разницу с вашим
    function User(x,y){
    let name = x;
    let age = y;
    
    return {
    name : name,
    age : age,
    sayHi: function(){
    console.log("My name is " + this.name);
    }
    }
    }


    тут все поля и функции лежат в одном объекте, который имеет только дефолтный __proto__ Object.prototype, автоматически присваиваемый при создании объекта через объектный литерал.
    При вызове функции несколько раз будут созданы несколько никак не связанных объекта. Прототип у них Object, это единственное что их роднит. Функции будут созданы каждый раз заново.
    user1.sayHi !== user2.sayHi
    Оператор instanceof не найдет у них общего предка User.

    Вот в этом и разница. Можно ли так писать? Можно, только зачем?
    Как назвать? Ну допустим функция-фабрика объектов. (не путатьс классом-фабрикой и со статическим фабричным методом, там создаются инстансы классов).

    Найдёте теперь сами разницу в ваших примерах 1 и 2?
    А так же почему в примере 1 new User() и просто User() дадут совершенно разный результат? И как сделать чтоб было одинаково?
    Ответ написан
    1 комментарий
  • Зачем использовать callback функцию(именно передавать ее в качестве аргумента),если можно просто вызвать функцию,которая видна например по замыканию?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Callback-функция может меняться от вызова к вызову основной функции.
    Например, метод Array.prototype.sort(), в который передаётся функция, определяющая порядок сортировки. В зависимости от переданной callback-функции метод может сортировать как числа, так и строки или объекты, как в возрастающем или убывающем порядке, так и в более сложном, например по расстоянию от заданной точки.
    Кстати, onload в вашем примере - это тоже callback-функция, только переданная как свойство, а не аргумент другой функции.
    Ответ написан
  • Поможете разобать вирусный скрипт,который спрятан в SVG картинке?

    petermzg
    @petermzg
    Самый лучший программист
    Вытащите скрипт, вставьте его в пустую страницу или jsfiddle.net в Chrome
    Добавьте в первую строкуdebugger;
    Откройте консоль разработчика и выполните покомандно. Станет ясно как это работает.
    Политика безопасности браузера не позволит выполниться тому коду, что не безопасен.
    Ответ написан
    4 комментария