Cosa si intende per “object di prima class”?

In una recente domanda , ho ricevuto suggerimenti per parlare, tra le altre cose, dell’aspetto di JavaScript in cui le funzioni sono oggetti di “prima class”. Cosa significa “prima class” in questo contesto, al contrario di altri oggetti?

EDIT (Jörg W Mittag): Exact Duplicate: “Cos’è un costrutto di programmazione di prima class?”

Per citare Wikipedia :

Nell’informatica, si dice che un linguaggio di programmazione supporti le funzioni di prima class (o la funzione letterale) se tratta le funzioni come oggetti di prima class. In particolare, ciò significa che il linguaggio supporta la costruzione di nuove funzioni durante l’esecuzione di un programma, memorizzandole in strutture di dati, passandole come argomenti ad altre funzioni e restituendole come valori di altre funzioni.

Anche questa pagina lo illustra magnificamente:

Davvero, proprio come qualsiasi altra variabile

  • Una funzione è un’istanza del tipo Object
  • Una funzione può avere proprietà e ha un link al suo metodo di costruzione
  • È ansible memorizzare la funzione in una variabile
  • È ansible passare la funzione come parametro a un’altra funzione
  • È ansible restituire la funzione da una funzione

leggi anche il commento di TrayMan, interessante …

La nozione di “funzioni di prima class” in un linguaggio di programmazione fu introdotta dallo scienziato informatico britannico Christopher Strachey negli anni ’60. La formulazione più famosa di questo principio è probabilmente in Structure and Interpretation of Computer Programs di Gerald Jay Sussman e Harry Abelson:

  • Possono essere nominati da variabili.
  • Possono essere passati come argomenti alle procedure.
  • Possono essere restituiti come risultati delle procedure.
  • Possono essere inclusi in strutture di dati.

Fondamentalmente, significa che puoi fare con le funzioni tutto ciò che puoi fare con tutti gli altri elementi nel linguaggio di programmazione. Quindi, nel caso di JavaScript, significa che tutto ciò che puoi fare con un intero, una stringa, una matrice o qualsiasi altro tipo di object, puoi anche fare con le funzioni.

Approvazione più completa della formulazione di Strachey-Sussman-Abelson. Quindi se la tua lingua supporta un tale costrutto allora hai una funzione come linguaggio di prima class 🙂

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

In breve, qualsiasi cosa è un object di prima class se agisce nella lingua come una sorta di manipolazione dello stato di object o tipo di object. Semplicemente qualcosa su cui puoi operare e passare le dichiarazioni e valutare contemporaneamente nelle espressioni. O ancora più breve: quando si può pensare a una funzione come a un object che può essere invocato ulteriormente.

Le funzioni JavaScript sono funzioni di prima class che significano che funzioni e oggetti sono trattati come la stessa cosa. Le funzioni possono essere memorizzate come variabili all’interno di un object o di un array e possono essere passate come argomento o essere restituite da un’altra funzione. Ciò rende la funzione “cittadini di prima class in JavaScript”

JavaScript utilizza la syntax di notazione letterale che rende difficile comprendere appieno il fatto che le funzioni JavaScript sono oggetti.

Per esempio..

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

entrambe le declinazioni sono equivalenti. Usando il new chiamiamo la funzione di costruzione di un object. Anche usando {} (collegamento JavaScript chiamato letterali) chiamiamo la funzione di costruzione di un object. {} è solo una rappresentazione più breve per creare un’istanza del costruttore.

La maggior parte delle lingue usa una new parola chiave per creare un object, quindi creiamo un object JavaScript.

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

Come vedi abbiamo creato una funzione nome object.

Creazione della stessa funzione del nome dell’object utilizzando l’espressione della funzione JavaScript.

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

Qui andiamo abbiamo appena creato una funzione nome object.

In javascript le funzioni sono oggetti di prima class perché possono fare molto più di quello che gli oggetti possono fare.

  • Una funzione è un’istanza di un tipo di object.

Function instanceof Object //returns true

Come un object, una funzione può avere proprietà e può avere un link alla sua funzione di costruzione.

  var o = {}; // empty object 'o' oa = 1 ; ob = 2 ; console.log(oa); // 1 console.log(ob); // 2 function foo(){}; foo.a = 3 ; foo.b = 4 ; console.log(foo.a); // logs 3 console.log(foo.b); // logs 4 

Semplice test Se puoi farlo nella tua lingua (Python come esempio):

 def double(x): return x*x f = double print f(5) #prints 25 

La tua lingua tratta le funzioni come oggetti di prima class.

Significa che le funzioni sono oggetti, con un tipo e un comportamento. Possono essere costruiti dynamicmente, passati come qualsiasi altro object e il fatto che possano essere chiamati fa parte della loro interfaccia.

Significa che la funzione eredita effettivamente da Object. In modo che tu possa passarlo e lavorarci come con qualsiasi altro object.

In c # tuttavia è necessario astenersi da delegati o riflessioni per giocare con le funzioni. (Questo è migliorato molto di recente con espressioni lambda)

Immagino che quando qualcosa è di prima class in una lingua, significa che è supportato dalla sua syntax piuttosto che da una libreria o da uno zucchero sintattico. per esempio, le classi in C non sono di prima class

Semplice in JavaScript, le funzioni sono oggetti di prima class, le funzioni sono di tipo Object e possono essere utilizzate in un modo di prima class come qualsiasi altro object (String, Array, Number, ecc.) Poiché sono in effetti oggetti loro stessi. Possono essere “memorizzati in variabili, passati come argomenti alle funzioni, creati all’interno di funzioni e restituiti da funzioni

La definizione sul sito Mozilla è concisa e chiara. In accordo con loro,

In JavaScript, le funzioni sono oggetti di prima class, poiché possono avere proprietà e metodi come qualsiasi altro object . Ciò che li distingue dagli altri oggetti è che le funzioni possono essere chiamate. In breve, sono oggetti funzionali.

E

una funzione è un “sottoprogramma” che può essere chiamato da codice esterno (o interno nel caso di ricorsione) alla funzione. Come il programma stesso, una funzione è composta da una sequenza di istruzioni chiamate corpo della funzione. I valori possono essere passati a una funzione e la funzione restituirà un valore.