Статьи

Голый JavaScript — функции конструктора


В части 4 серии —
Голый джаваскрипт
, мы собираемся более глубоко взглянуть на функции в Javscript и исследовать его искаженный синтаксис и различные последствия. В
предыдущей статье мы узнали о различных способах вызова функций. В этой части мы рассмотрим материал, который отвечает за создание функций в JavaScript.

Функции в JavaScript фантастические.
Они не только используются для выполнения функций, но и для создания других объектов и функций (да, вы правильно прочитали). Функции — это средство, с помощью которого вы реализуете очень важную особенность языка — наследование. О деталях наследования мы поговорим позже. А пока давайте продолжим изучение функций.

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

Давайте сначала попробуем ответить на очень простой вопрос.
Что именно является функцией? Ну, функция — это не что иное, как объект Javascript. Да, я знаю, что я говорил это много раз в предыдущих частях серии, но поверьте мне, когда я говорю, что невозможно подчеркнуть этот момент меньше.

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

В javascript для создания объектов все, что вам нужно, это определить конструктор.
В отличие от других языков программирования (например, Java), вам не требуется никакой специальной оболочки вокруг функции, т. Е. Ваш конструктор не должен определяться внутри класса. Конструктор — это просто обычная функция. Например

function Employee(){
 //blah blah
 console.log('Employee function');
};

Это простая функция конструктора.
В этой функции нет ничего особенного. Единственное, что здесь отличается, — это тот факт, что мы следовали другому соглашению об именах, используя заглавные буквы первого имени функции. Это соглашение рекомендуется и важно, когда вы объявляете функции конструктора, поскольку оно позволяет другим отличать обычные функции от функций, предназначенных для использования в качестве функции конструктора.

Теперь эта функция, кажется, не делает ничего особенного.
Но в Javascript вы можете сделать что-то совершенно странное. Вы можете создавать экземпляры функций. Например, после того, как вы объявили функцию конструктора сотрудника, подобную приведенной выше, вы можете сделать что-то вроде этого.

function Employee(){
 console.log('Employee function');
};
 
var emp1 = new Employee();

Синтаксис и сбивает с толку, и забавен.
Давайте попробуем понять, что именно происходит здесь, когда мы вызываем функцию вместе с новым оператором.

Этот синтаксис вызова функций, которые должны быть функциями конструктора, был разработан для привлечения программистов на Java. Когда вы вызываете функцию, используя ключевое слово «new», среда выполнения создает пустой объект и передает этот объект в функцию. Этот объект становится значением ключевого слова this внутри функции. Я подробно расскажу об этом ключевом слове в JavaScript в следующей части этой серии. Но пока предположим, что при вызове с использованием ключевого слова «new» функция «this» внутри функции ведет себя подобно ключевому слову «this», используемому в Java. Как только функция заканчивает свое выполнение, она автоматически возвращает ссылку на this, даже если вы явно написали инструкцию return в конце функции.Обратите внимание, что если бы вы вызвали функцию Employee () без ключевого слова «new», новый объект не был бы создан, и наша функция Employee ничего бы не возвратила без явного оператора return.

После выполнения функции переменная emp1 теперь указывает на вновь созданный объект.
Вы можете думать, что этот объект является экземпляром функции. Я так говорю, потому что если вы попытаетесь выполнить emp1 instanceof Employee, он вернет true. Ключевое слово instanceof — это простой способ определить имя функции, отвечающей за создание объекта.

Мало того, каждый объект имеет доступ к свойству, называемому «конструктор», которое сообщает вам о конструкторе этого объекта.
Например, вы могли бы сделать что-то вроде этого.

function Employee(){
 console.log('Executing Employee function');
};
 
var emp1 = new Employee();
var dummy = {};
 
console.log(dummy.constructor);
console.log(emp1.constructor);

Когда вы запустите его в Chrome, вы сможете увидеть следующие строки в консоли.

Executing Employee function
function Object() { [native code] }
function Employee(){ console.log('Executing Employee function'); }


Первая строка — это обычный console.log, который был выполнен при создании нового объекта функции.
В любом случае, это не большая загадка. Но затем вы видите другую строку с надписью «function Object () {[native code]}». Это происходит из журнала dummy.constructor. И затем в следующей строке вы видите все грязные мелочи нашей собственной функции «Сотрудник». (Этот момент должен дать вам идеи!).

Хорошо, теперь, когда мы понимаем, как создать пользовательскую функцию конструктора и создать экземпляры с помощью функции конструктора, давайте немного позабавимся с функциями.

Помните, когда я говорил это, что функции тоже объекты?
И это прямо подразумевает, что должна быть какая-то функция-конструктор, которая создает функции (предупреждение о скороговорке!). Смеете исследовать? Да сэр!

function Employee(){
 console.log('Executing Employee function');
};
 
console.log(Employee.constructor);

Оказывается, что есть функция под названием «Функция», которая делает волшебство создания функций для нас (это должен быть ваш момент Эврики, ryt !! Или, может быть, только я).

Таким образом, у нас есть функция, которая создает другие функции, и она точно называется функцией «Функция».
Также обратите внимание, что здесь соблюдается соглашение об именах для функции конструктора. Эй, угадай что? Даже анонимные функции имеют один и тот же конструктор. Конечно, они делают, так как они тоже функции (люблю это рифму, не так ли?).

console.log((function noname(){}).constructor);

Что ж, позволю любопытству убить кота и выяснить, кто тоже выполняет функцию, потому что, эй, это даже объект, правда?

console.log(Function.constructor);

Кажется, что функция Function создает себя.
(Хорошо, теперь кошка мертва). 

Теперь, когда вы знаете, что функция создает функцию, это дает вам возможность сформулировать новый синтаксис для создания функций.

var dynamicFunction = new Function();
 


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

var nowThisIsWeirdButCool = new Function('p1','p2','console.log("Stripping "+p2+" "+p1)');
nowThisIsWeirdButCool('Naked','Javascript');

Как видите, это довольно запутанный способ определения функций, но, тем не менее, это, безусловно, один из способов создания функций в JavaScript. Удивительно верно? Но обратите внимание, что это действительно ПЛОХО ПЛОХОЙ способ создания функций, потому что функции, созданные с использованием этого метода, используют священную функцию JavaScript ‘eval’, чтобы оценить определение тела функции, предоставляемого в качестве строкового параметра во время выполнения. Использование функции eval () считается злом. (Должен ли я сказать, что эти два слова даже рифмуются в определенной степени. Видите мою точку зрения?). 

В заключение, этот пост раскрыл еще несколько аспектов функций в JavaScript.
Как я уже говорил ранее, функции являются строительными блоками многих вещей в JavaScript, поэтому совершенно невозможно говорить о чем-либо в JavaScript, не говоря о функциях и их различных особенностях. 

Тем не менее, это все, что у меня есть для этой части серии.
Это еще не все. Следите за новостями! 

Удачного программирования ?