Co należy rozumieć przez „obiekt pierwszej klasy”?

146

W ostatnim pytaniu otrzymałem sugestie, aby porozmawiać między innymi o tym aspekcie JavaScript, w którym funkcje są obiektami „pierwszej klasy”. Co w tym kontekście oznacza „pierwsza klasa”, w przeciwieństwie do innych przedmiotów?

EDYCJA (Jörg W Mittag): Dokładne powtórzenie: "Co to jest konstrukcja programistyczna pierwszej klasy?"

ProfK
źródło

Odpowiedzi:

179

Cytując Wikipedię :

W informatyce mówi się, że język programowania obsługuje funkcje pierwszej klasy (lub literał funkcji), jeśli traktuje funkcje jako obiekty pierwszej klasy. W szczególności oznacza to, że język obsługuje konstruowanie nowych funkcji podczas wykonywania programu, przechowywanie ich w strukturach danych, przekazywanie ich jako argumentów do innych funkcji i zwracanie ich jako wartości innych funkcji.

Ta strona również pięknie to ilustruje :

Naprawdę, tak jak każda inna zmienna

  • Funkcja jest instancją typu Object
  • Funkcja może mieć właściwości i mieć łącze z powrotem do metody konstruktora
  • Możesz przechowywać funkcję w zmiennej
  • Funkcję można przekazać jako parametr do innej funkcji
  • Możesz zwrócić funkcję z funkcji

przeczytaj także komentarz TrayMan, interesujący ...

Sander Versluys
źródło
11
Cytowanie Wikipedii jest miłe i eleganckie, ale opis jest napisany w języku dla naukowców, a nie dla geeków. Co to w ogóle znaczy do cholery? Ostatnie zdanie w tym cytacie jest niejasne.
Spoike
1
@Spoike, prawda ... udostępniono zasób javascript.
Sander Versluys
16
Dogodnie język, który ma funkcje pierwszej klasy, ma również funkcje wyższego rzędu, w przeciwieństwie do ograniczenia do funkcji pierwszego rzędu, co wykluczałoby funkcje pierwszej klasy. (Chociaż możliwe jest uzyskanie wyższego rzędu, a nie pierwszej klasy).
TrayMan
5
Nie znalazłem nic niejasnego w cytacie z Wikipedii, ale dodatkowy link jest doskonały.
ProfK
4
Link już nie działa (po około 8 latach).
doubleOrt
47

Pojęcie „funkcji pierwszej klasy” w języku programowania zostało wprowadzone przez brytyjskiego informatyka Christophera Stracheya w latach sześćdziesiątych XX wieku. Najbardziej znane sformułowanie tej zasady znajduje się prawdopodobnie w Strukturze i interpretacji programów komputerowych autorstwa Geralda Jaya Sussmana i Harry'ego Abelsona:

  • Mogą być nazywane zmiennymi.
  • Mogą być przekazywane jako argumenty do procedur.
  • Mogą zostać zwrócone jako wynik procedur.
  • Mogą być zawarte w strukturach danych.

Zasadniczo oznacza to, że za pomocą funkcji można zrobić wszystko, co można zrobić ze wszystkimi innymi elementami języka programowania. Tak więc w przypadku JavaScript oznacza to, że wszystko, co możesz zrobić z liczbą całkowitą, ciągiem, tablicą lub jakimkolwiek innym rodzajem obiektu, możesz również zrobić z funkcjami.

Jörg W Mittag
źródło
14

Pełniejsza aprobata preparatu Strachey-Sussman-Abelsona. Więc jeśli twój język obsługuje taką konstrukcję, masz funkcję jako język pierwszej klasy :)

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... :)

Krótko mówiąc, wszystko jest obiektem pierwszej klasy, jeśli działa w języku jako rodzaj obiektu lub typu obiektu manipulującego stanem. Po prostu coś, na czym można operować, przekazywać instrukcje i oceniać w wyrażeniach w tym samym czasie. Albo jeszcze krócej: kiedy możesz myśleć o funkcji jak o obiekcie, który można dodatkowo wywołać.

Arman McHitarian
źródło
9

Funkcje JavaScript są funkcjami pierwszej klasy, co oznacza, że ​​funkcje i obiekty są traktowane tak samo. Funkcje mogą być przechowywane jako zmienne wewnątrz obiektu lub tablicy, a także mogą być przekazywane jako argument lub zwracane przez inną funkcję. To sprawia, że ​​funkcja jest „obywatelami pierwszej klasy w JavaScript”

JavaScript używa składni notacji dosłownej, co utrudnia pełne zrozumienie faktu, że funkcje JavaScript są obiektami.

Na przykład..

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

obie deklaracje są równoważne. Używając newwywołujemy funkcję konstruktora obiektu. Również za pomocą {}(skrótu JavaScript zwanego literałami) wywołujemy funkcję konstrukcyjną obiektu. {}jest po prostu krótszą reprezentacją do tworzenia wystąpienia konstruktora.

Większość języków używa newsłowa kluczowego do tworzenia obiektu, więc stwórzmy obiekt JavaScript.

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

Jak widać stworzyliśmy nazwę obiektu funkcji .

Tworzenie tej samej funkcji nazwy obiektu przy użyciu wyrażenia funkcji JavaScript.

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

Zaczynamy, właśnie utworzyliśmy funkcję nazwy obiektu.

Mark Adler
źródło
9

W javascript funkcje są obiektami pierwszej klasy, ponieważ potrafią znacznie więcej niż obiekty.

  • Funkcja jest instancją typu Object.

Function instanceof Object //returns true

Podobnie jak obiekt, funkcja może mieć właściwości i może mieć łącze z powrotem do swojej funkcji konstruktora.

 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 

  • Funkcje mogą być przechowywane w zmiennej jako wartość.

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

  • Funkcje można przekazywać jako argumenty do innych funkcji

function callback (foo){
      foo();
}

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

  • Możesz zwrócić funkcję z funkcji

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

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

  • Może być przechowywany w zmiennej jako odniesienie.

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

Sagar Munjal
źródło
Obiekt może to wszystko zrobić.
doubleOrt
5

Prosty test. Jeśli możesz to zrobić w swoim języku (na przykład Python):

def double(x):
    return x*x

f = double

print f(5) #prints 25

Twój język traktuje funkcje jak obiekty pierwszej klasy.

Yuval Adam
źródło
3
Ale mogę to zrobić w C ++: int dwa razy (int x) {return x << 1; } int (* f) (int) = dwa razy; std :: cout << (* f) (5) << std :: endl; Czy to oznacza, że ​​C ++ traktuje funkcje jako obiekty pierwszej klasy (o śmiesznej składni)?
Thomas L Holaday
1
Dopóki nie będziesz mógł stworzyć funkcji wewnątrz funkcji, chcę powiedzieć nie.
cHao,
1
Wskaźniki funkcji C obsługują (bardzo ograniczoną definicję) funkcje pierwszej klasy, ale funkcje nie są obiektami. Wskaźniki funkcji w C nie zawierają stanu ani zachowania.
Steven Kramer
2

Oznacza to, że funkcje są obiektami, mają typ i zachowanie. Można je dynamicznie budować i przekazywać jak każdy inny obiekt, a fakt, że można je wywołać, jest częścią ich interfejsu.

cadrian
źródło
2

Oznacza to, że funkcja faktycznie dziedziczy po Object. Abyś mógł go przekazywać i pracować z nim jak z każdym innym przedmiotem.

Jednak w języku C # musisz powstrzymać się od delegatów lub refleksji, aby bawić się funkcjami. (ostatnio znacznie się poprawiło dzięki wyrażeniom lambda)

Rashack
źródło
2

Definicja na stronie Mozilli jest zwięzła i jasna. Według nich,

W JavaScript funkcje są obiektami pierwszej klasy, ponieważ mogą mieć właściwości i metody tak jak każdy inny obiekt . To, co odróżnia je od innych obiektów, to możliwość wywoływania funkcji. Krótko mówiąc, są to obiekty Function.

I

funkcja jest „podprogramem”, który można wywołać kodem zewnętrznym (lub wewnętrznym w przypadku rekursji) w stosunku do funkcji. Podobnie jak sam program, funkcja składa się z sekwencji instrukcji zwanych treścią funkcji. Wartości można przekazać do funkcji, a funkcja zwróci wartość.

Arpit
źródło
0

Myślę, że jeśli coś jest pierwszej klasy w języku, oznacza to, że jest obsługiwane przez składnię, a nie przez bibliotekę lub cukier składniowy. na przykład klasy w C nie są pierwszą klasą

Jiang Qiu
źródło
0

Proste w JavaScript funkcje są obiektami pierwszej klasy, to znaczy funkcje są typu Object i mogą być używane w sposób pierwszej klasy jak każdy inny obiekt (String, Array, Number, itp.), Ponieważ w rzeczywistości są obiektami sami. Mogą być „przechowywane w zmiennych, przekazywane jako argumenty do funkcji, tworzone w ramach funkcji i zwracane z funkcji

Santi
źródło