O que se entende por “object de primeira class”?

Em uma pergunta recente , recebi sugestões para falar, entre outras coisas, sobre o aspecto do JavaScript, onde as funções são objects de “primeira class”. O que a ‘primeira class’ significa neste contexto, em oposição a outros objects?

EDIT (Jörg W Mittag): Exato Duplicar: “O que é uma construção de programação de primeira class?”

Para citar a Wikipedia :

Na ciência da computação, diz-se que uma linguagem de programação suporta funções de primeira class (ou function literal) se trata funções como objects de primeira class. Especificamente, isso significa que a linguagem suporta a construção de novas funções durante a execução de um programa, armazenando-as em estruturas de dados, passando-as como argumentos para outras funções e retornando-as como os valores de outras funções.

Esta página também ilustra isso lindamente:

Realmente, assim como qualquer outra variável

  • Uma function é uma instância do tipo de object
  • Uma function pode ter propriedades e tem um link de volta para seu método construtor
  • Você pode armazenar a function em uma variável
  • Você pode passar a function como um parâmetro para outra function
  • Você pode retornar a function de uma function

Leia também o comentário do TrayMan, interessante …

A noção de “funções de primeira class” em uma linguagem de programação foi introduzida pelo cientista da computação britânico Christopher Strachey na década de 1960. A formulação mais famosa deste princípio é provavelmente em Estrutura e Interpretação de Programas de Computador por Gerald Jay Sussman e Harry Abelson:

  • Eles podem ser nomeados por variables.
  • Eles podem ser passados ​​como argumentos para procedimentos.
  • Eles podem ser devolvidos como resultados de procedimentos.
  • Eles podem ser incluídos em estruturas de dados.

Basicamente, isso significa que você pode fazer com as funções tudo o que você pode fazer com todos os outros elementos na linguagem de programação. Assim, no caso do JavaScript, isso significa que tudo o que você pode fazer com um Integer, um String, um Array ou qualquer outro tipo de object, você também pode fazer com funções.

Aprovação mais completa da formulação de Strachey-Sussman-Abelson. Então, se o seu idioma suporta tal construção, então você tem uma function como uma linguagem de primeira 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... :) 

Em suma, tudo é um object de primeira class, se ele age na linguagem como um tipo de object de manipulação de estado ou tipo de object. Simplesmente algo em que você pode operar e passar instruções e avaliar expressões ao mesmo tempo. Ou ainda mais curto: quando você pode pensar em uma function como um object que pode ser chamado adicionalmente.

Funções JavaScript são funções de primeira class que significam funções e objects são tratados como a mesma coisa. As funções podem ser armazenadas como uma variável dentro de um object ou uma matriz, assim como podem ser passadas como um argumento ou ser retornadas por outra function. Isso faz com que a function “cidadãos de primeira class em JavaScript”

O JavaScript usa a syntax de notação literal, o que dificulta compreender totalmente o fato de que nas funções JavaScript são objects.

Por exemplo..

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

ambas as declerations são equivalentes. Ao usar o new , estamos chamando a function construtora de um object. Também usando {} (atalho JavaScript chamado literais) estamos chamando a function de construção de um object. {} é apenas uma representação mais curta para instanciar o construtor.

A maioria das linguagens usa uma new palavra-chave para criar um object, então vamos criar um object JavaScript.

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

Como você vê, criamos uma function de nome de object.

Criando a mesma function de nome de object usando a expressão de function JavaScript.

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

Aqui vamos nós apenas criamos uma function de nome de object.

Em javascript funções são objects de primeira class, porque ele pode fazer muito mais do que objects podem fazer.

  • Uma function é uma instância de um tipo de object.

Function instanceof Object //returns true

Como um object, uma function pode ter propriedades e pode ter um link de volta para sua function de construtor.

  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 

Teste simples. Se você puder fazer isso no seu idioma (Python como exemplo):

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

Sua linguagem está tratando funções como objects de primeira class.

Isso significa que as funções são objects, com um tipo e um comportamento. Eles podem ser construídos dinamicamente, passados ​​como qualquer outro object, e o fato de poderem ser chamados faz parte de sua interface.

Isso significa que a function realmente herda de Object. Para que você possa passá-lo e trabalhá-lo como em qualquer outro object.

Em c # no entanto, você precisa abster-se de delegates ou reflection para brincar com funções. (isso ficou muito melhor recentemente com expressões lambda)

Eu acho que quando algo é de primeira class em uma linguagem, isso significa que é suportado por sua syntax, em vez de uma biblioteca ou açúcar sintático. por exemplo, classs em C não são de primeira class

Simples em JavaScript, funções são objects de primeira class ou seja, funções são do tipo Object e podem ser usadas de uma maneira de primeira class como qualquer outro object (String, Array, Number, etc.) já que elas são objects de fato. si mesmos. Eles podem ser “armazenados em variables, passados ​​como argumentos para funções, criados dentro de funções e retornados de funções

Definição no site da Mozilla é concisa e clara. De acordo com eles,

Em JavaScript, as funções são objects de primeira class, porque podem ter propriedades e methods como qualquer outro object . O que os distingue de outros objects é que as funções podem ser chamadas. Em resumo, eles são objects Function.

E

Uma function é um “subprograma” que pode ser chamado pelo código externo (ou interno no caso de recursion) para a function. Como o próprio programa, uma function é composta de uma seqüência de instruções chamada corpo da function. Os valores podem ser passados ​​para uma function e a function retornará um valor.