Що означає «об’єкт першого класу»?


146

У недавньому запитанні я отримав пропозиції поговорити, між іншим, про аспект JavaScript, де функції - об'єкти "першого класу". Що означає "перший клас" у цьому контексті на відміну від інших об'єктів?

EDIT (Jörg W Mittag): Точний дублікат: "Що таке першокласна конструкція програмування?"


Відповіді:


179

Щоб цитувати Вікіпедію :

В інформатиці мова мови програмування підтримує функції першого класу (або функції буквально), якщо вона розглядає функції як об'єкти першого класу. Зокрема, це означає, що мова підтримує побудову нових функцій під час виконання програми, зберігання їх у структурах даних, передачу їх як аргументів іншим функціям та повернення їх як значення інших функцій.

Ця сторінка також це прекрасно ілюструє :

Дійсно, як і будь-яка інша змінна

  • Функція - це екземпляр типу Object
  • Функція може мати властивості і має посилання назад до методу її конструктора
  • Ви можете зберігати функцію у змінній
  • Ви можете передати функцію як параметр іншій функції
  • Ви можете повернути функцію з функції

також читайте коментар TrayMan, цікаво ...


11
Цитування вікіпедії є приємним і дендним, але опис написано мовою для вчених, а не для вундеркіндів. Що, до біса, все це означає? Останнє речення в цій цитаті - вагу.
Спійк

1
@Spoike, правда ... надано ресурс javascript.
Сандер Верслуйс

16
Зручно, що мова, яка має функції першого класу, також має функції вищого порядку, на відміну від обмеженості функціями першого порядку, які виключають функції першого класу. (Хоча вищий клас, не перший клас можливий.)
TrayMan

5
Я не знайшов нічого незрозумілого в цитаті Вікіпедії, але додаткове посилання є чудовим.
ПрофК

4
Посилання більше не працює (приблизно через 8 років).
подвійнийокт

47

Поняття «першокласні функції» мовою програмування було введено британським вченим-комп’ютером Крістофером Страчі в 1960-х роках. Найвідоміше формулювання цього принципу, ймовірно, у структурі та інтерпретації комп’ютерних програм Джеральда Джея Суссмана та Гаррі Абелсона:

  • Вони можуть бути названі змінними.
  • Вони можуть бути передані як аргументи до процедур.
  • Вони можуть бути повернуті як результати процедур.
  • Вони можуть бути включені до структур даних.

В основному це означає, що ви можете робити з функціями все, що ви можете зробити з усіма іншими елементами мови програмування. Так, у випадку JavaScript це означає, що все, що ви можете зробити з цілим числом, рядком, масивом або будь-яким іншим об'єктом, ви також можете робити з функціями.


14

Більш повне схвалення рецептури Страчі-Суссмана-Абельсона. Тож якщо ваша мова підтримує таку конструкцію, то у вас є функція як мова першого класу :)

var men = function (objectOfAdmiration) {
  return objectOfAdmiration();
};
men.isSweetHeart = true;

var women = function (objectOfAdmiration) {
  return objectOfAdmiration();
};
women.isSweetHeart = true;

var aliens = function (objectOfAdmiration) {
  return objectOfAdmiration();
};

function like(obj){
  if (obj.isSweetHeart) {
      return function (){ return "Holy TRUE!"}; 
  }
  else {
      return function (){ return "Holy CRAP!"};
  }
}

alert("Men like women is " + men(like(women))); // -> "Holly TRUE!"
alert("Women like men is " + women(like(men))); // -> "Holly TRUE!"

alert("Men like aliens is " + men(like(aliens))); // -> "Holly CRAP!"
alert("Aliens like women is " + aliens(like(women))); // -> "Holly TRUE!" :)

//women(like(aliens)); //  Who knows? Life is sometimes so unpredictable... :)

Коротше кажучи, що-небудь є першокласним об'єктом, якщо він виступає мовою як різновид об'єкта чи типу об'єкта маніпулювання. Просто щось, з чим ви можете працювати і одночасно передавати твердження та оцінювати в виразах. Або навіть коротше: коли ви можете думати про функцію як об'єкт, який можна додатково викликати.


9

Функції JavaScript - це першокласні функції, тобто функції та об'єкти трактуються як одне і те ж. Функції можуть бути збережені у вигляді змінної всередині об'єкта або масиву, а також можуть бути передані як аргумент або повернуті іншою функцією. Це робить функцію "першокласні громадяни в JavaScript"

JavaScript використовує синтаксис буквальних позначень, що ускладнює повне розуміння того, що в JavaScript функції є об'єктами.

Наприклад..

var youObj1 = new Object();
// or
var youObj1 = {};

обидві декларації рівнозначні. За допомогою newми викликаємо функцію конструктора Об'єкта. Також за допомогою {}(ярлик JavaScript, який називається літералами) ми викликаємо функцію побудови Об'єкта. {}- це лише коротше подання про інстанціювання конструктора.

Більшість мов використовує newключове слово для створення об'єкта, тому давайте зможе створити об’єкт JavaScript.

var myFunction = new Function("a",  "b", 'return a_b');

Як ви бачите , ми створили ім'я об'єкта функції .

Створення тієї ж функції імені об’єкта за допомогою вираження функції JavaScript ..

var myFunction = function myFunction(a,b) {
    return a+b;
}

Ось ми просто створили функцію імені об'єкта.


9

Функції javascript - це об'єкти першого класу, оскільки вони можуть зробити набагато більше, ніж те, що можуть зробити об'єкти.

  • Функція - це примірник типу Object.

Function instanceof Object //returns true

Як і об'єкт, функція може мати властивості і може мати посилання назад до її функції конструктора.

 var o = {}; // empty object 'o'
    o.a = 1 ; 
    o.b = 2 ; 

    console.log(o.a); // 1
    console.log(o.b); // 2 


    function foo(){};
    foo.a = 3 ; 
    foo.b = 4 ; 

    console.log(foo.a);  // logs 3
    console.log(foo.b);  // logs 4 

  • Функції можна зберігати у змінній як значення.

  var foo = function(){}; 
    console.log(foo); // function(){}

  • Функції можна передавати як аргументи іншим функціям

function callback (foo){
      foo();
}

callback(function(){console.log('Successfuly invoked as an argument inside function callback')})

  • Ви можете повернути функцію з функції

 function foo(){
	    return function(){console.log('working!')};
    }

    var bar = foo();
    bar(); // working!

  • Може зберігатися у змінній як посилання.

    var sum = function (a,b){return a+b}  
    sum(4,4);


Об'єкт також може все це робити.
подвійнийокт

5

Простий тест. Якщо ви можете зробити це своєю мовою (Python як приклад):

def double(x):
    return x*x

f = double

print f(5) #prints 25

Ваша мова розглядає функції як об'єкти першого класу.


3
Але я можу це зробити в C ++: int двічі (int x) {return x << 1; } int (* f) (int) = двічі; std :: cout << (* f) (5) << std :: endl; Чи означає це, що C ++ розглядає функції як об'єкти першого класу (із кумедним синтаксисом)?
Thomas L Holaday

1
Доки ви можете створити функцію всередині функції, я хочу сказати "ні".
cHao

1
Покажчики функцій C підтримують (дуже обмежене визначення) функцій першого класу, але функції не є об'єктами. Функціональні покажчики на C не містять стану та поведінки.
Стівен Крамер

2

Це означає, що функції - це об'єкти, що мають тип і поведінку. Їх можна динамічно будувати, передавати навколо, як будь-який інший об'єкт, і те, що їх можна назвати, є частиною їх інтерфейсу.


2

Це означає, що функція фактично успадковується від Object. Так що ви можете передати його навколо і працювати з ним, як і з будь-яким іншим об'єктом.

У c # однак вам потрібно утриматися від делегатів або роздумів, щоб пограти з функціями. (це стало набагато краще останнім часом з лямбда-виразами)


2

Визначення на сайті Mozilla є стислим та зрозумілим. За їх словами,

У JavaScript функції є першокласними об'єктами, оскільки вони можуть мати властивості та методи так само, як і будь-який інший об’єкт . Що відрізняє їх від інших об'єктів, це те, що функції можна назвати. Коротше кажучи, вони є об'єктами функцій.

І

функція - це "підпрограма", яку можна викликати кодом зовнішнім (або внутрішнім у разі рекурсії) функції. Як і сама програма, функція складається з послідовності висловлювань, званих тілом функції. Значення можуть бути передані функції, і функція поверне значення.


0

Я думаю, коли щось є мовою першого класу, це означає, що це підтримується його синтаксисом, а не бібліотекою чи синтаксичним цукром. наприклад, класи на C - це не перший клас


0

Прості в JavaScript, функції - це об'єкти першокласного характеру, тобто функції типу Object, і вони можуть бути використані першокласним чином, як і будь-який інший об'єкт (String, Array, Number тощо), оскільки вони є фактично об'єктами себе. Вони можуть бути «збережені у змінних, передані як аргументи до функцій, створені в межах функцій та повернуті з функцій

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.