Функции в javascript — это объекты

7

Функции это объекты

Одна из основных концепция в JS — что функции это объекты.

//Constructor function
function Circle(radius) {
  this.radius = radius;
  this.draw = function() {
    console.log('draw');
  }
}

const another = new Circle(2);
another.draw();

Таким образом, эта функция Circle тоже является объектом. Например, вы можете посмотреть свойтво Circle.name — чтобы получить имя функции, или Circle.length — чтобы получить количество аргументов. Так как функция тоже объект, то у нее также есть свойство constructor. И, к примеру, у функции Circle конструктором является другой встроенный в js конструктор, называемый Function.

Когда мы объявляем функцию используя этот синтакс, под катом движок JS будет использовать эту функцию-конструктор для создания этого объекта

function constructor

Например, объявим константу Circle1 и укажем в неё новый объект созданный чере new Function(). Первым параметром укажем аргумент radius, вторым, код функции.

const Circle1 = new Function('radius', `
    this.radius = radius;
    this.draw = function() {
        console.log('draw');
    }
`);

И теперь вызовем ёё как конструктор

const circle = new Circle1(1);

Теперь взглянем на пару методов, доступных в наших функциях.

Например, метод call — с помощью которого мы можем вызвать функцию. Первый её аргумент это this. Здесь нам нужно передать пустой объект, и тогда this, который внутри функции, будет указывать на объект который мы передали. После этого мы явно укажем наши аргументы.

Circle.call({}, 1)

И так, это выражение, такое же как предыдущие, т.е.:

const another = new Circle(1);

Т.е. когда мы используем оператор new, этот оператор под катом создаст пустой объект и передаст его как первый аргумент метода call. И этот объект определит контекст для this. т.е. this будет указывать на этот объект, который указан в call первым аргументом. Если не использовать оператор new, то this по умолчанию будет указывать на глобальный объект.

Метод apply, который такой же как и метод call, с помощью которого мы можем вызывать функцию, но вместо того чтобы передавать все аргументы явно, мы передаем их в массиве.

You might also like More from author

Leave A Reply

Your email address will not be published.