O que se entende por 'objeto de primeira classe'?

146

Em uma pergunta recente , recebi sugestões para discutir, entre outras coisas, o aspecto do JavaScript em que funções são objetos de 'primeira classe'. O que a 'primeira classe' significa neste contexto, em oposição a outros objetos?

EDIT (Jörg W Mittag): duplicado exato: "O que é uma construção de programação de primeira classe?"

ProfK
fonte

Respostas:

179

Para citar a Wikipedia :

Na ciência da computação, diz-se que uma linguagem de programação suporta funções de primeira classe (ou função literal) se tratar funções como objetos de primeira classe. 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 valores de outras funções.

Esta página também ilustra muito bem:

Realmente, assim como qualquer outra variável

  • Uma função é uma instância do tipo de objeto
  • Uma função pode ter propriedades e possui um link para seu método construtor
  • Você pode armazenar a função em uma variável
  • Você pode passar a função como parâmetro para outra função
  • Você pode retornar a função de uma função

leia também o comentário de TrayMan, interessante ...

Sander Versluys
fonte
11
A citação da wikipedia é agradável e elegante, mas a descrição está escrita em um idioma para cientistas e não para geeks. O que diabos isso significa? A última frase dessa citação é vaga.
Spoike
1
@ Spike, true ... forneceu o recurso javascript.
Sander Versluys 01/04/09
16
Convenientemente, uma linguagem que possui funções de primeira classe também possui funções de ordem superior, em vez de se limitar a funções de primeira ordem, o que excluiria funções de primeira classe. (Apesar de ordem superior, não de primeira classe é possível.)
TrayMan
5
Não achei nada claro na citação da Wikipedia, mas o link adicional é excelente.
ProfK
4
O link não está mais funcionando (depois de 8 anos).
precisa saber é o seguinte
47

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

  • Eles podem ser nomeados por variáveis.
  • Eles podem ser passados ​​como argumentos para procedimentos.
  • Eles podem ser retornados como resultados dos procedimentos.
  • Eles podem ser incluídos nas estruturas de dados.

Basicamente, isso significa que você pode fazer com funções tudo o que pode fazer com todos os outros elementos na linguagem de programação. Portanto, no caso do JavaScript, significa que tudo o que você pode fazer com um Inteiro, uma String, uma Matriz ou qualquer outro tipo de Objeto, também pode ser usado com funções.

Jörg W Mittag
fonte
14

Aprovação mais completa da formulação de Strachey-Sussman-Abelson. Portanto, se o seu idioma suportar essa construção, você terá uma função como idioma de primeira classe :)

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 resumo, qualquer coisa é um objeto de primeira classe se ele age na linguagem como um tipo de objeto ou tipo de manipulação de estado. Simplesmente algo em que você pode operar, repassar declarações e avaliar expressões ao mesmo tempo. Ou ainda mais: quando você pode pensar em uma função como um objeto que pode ser chamado adicionalmente.

Arman McHitarian
fonte
9

Funções JavaScript são funções de primeira classe, o que significa que funções e objetos são tratados como a mesma coisa. As funções podem ser armazenadas como uma variável dentro de um objeto ou matriz, assim como podem ser passadas como argumento ou retornadas por outra função. Isso torna a função "cidadãos de primeira classe em JavaScript"

O JavaScript usa sintaxe de notação literal, o que dificulta a compreensão completa do fato de que nas funções JavaScript são objetos.

Por exemplo..

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

ambas as declinações são equivalentes. Usandonew , estamos chamando a função construtora de um Objeto. Também usando {}(atalho JavaScript chamado literals) estamos chamando a função de construção de um Object. {}é apenas uma representação mais curta para instanciar o construtor.

A maioria dos idiomas usa new palavras-chave para criar um objeto, então vamos criar um objeto JavaScript.

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

Como você vê, criamos um nome de objeto função de .

Criando a mesma função de nome de objeto usando a expressão da função JavaScript.

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

Aqui vamos nós, apenas criamos uma função de nome de objeto.

Mark Adler
fonte
9

No javascript, as funções são objetos de primeira classe, porque podem fazer muito mais do que objetos.

  • Uma função é uma instância de um tipo de objeto.

Function instanceof Object //returns true

Como um objeto, uma função pode ter propriedades e um link para sua função construtora.

 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 

  • As funções podem ser armazenadas em uma variável como um valor.

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

  • Funções podem ser passadas como argumentos para outras funções

function callback (foo){
      foo();
}

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

  • Você pode retornar uma função de uma função

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

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

  • Pode ser armazenado em uma variável como referência.

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

Sagar Munjal
fonte
Um objeto pode fazer tudo isso também.
precisa saber é o seguinte
5

Teste simples. Se você pode fazer isso na sua linguagem (Python como exemplo):

def double(x):
    return x*x

f = double

print f(5) #prints 25

Seu idioma está tratando funções como objetos de primeira classe.

Yuval Adam
fonte
3
Mas eu posso fazer isso em C ++: int duas vezes (int x) {return x << 1; } int (* f) (int) = duas vezes; std :: cout << (* f) (5) << std :: endl; Isso significa que o C ++ trata funções como objetos de primeira classe (com uma sintaxe engraçada)?
Thomas L Holaday
1
Até que você possa criar uma função dentro de uma função, eu quero dizer não.
cHao 23/09/10
1
Os ponteiros de função C suportam (uma definição muito limitada de) funções de primeira classe, mas funções não são objetos. Os ponteiros de função em C não contêm estado ou comportamento.
Steven Kramer
2

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

Cadrian
fonte
2

Isso significa que a função realmente herda de Object. Para que você possa distribuí-lo e trabalhar com ele como em qualquer outro objeto.

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

Rashack
fonte
2

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

Em JavaScript, funções são objetos de primeira classe, porque podem ter propriedades e métodos como qualquer outro objeto . O que os diferencia de outros objetos é que funções podem ser chamadas. Em resumo, eles são objetos de Função.

E

uma função é um "subprograma" que pode ser chamado por código externo (ou interno no caso de recursão) à função. Como o próprio programa, uma função é composta por uma sequência de instruções chamada corpo da função. Os valores podem ser passados ​​para uma função e a função retornará um valor.

Arpit
fonte
0

Eu acho que quando algo é de primeira classe em um idioma, significa que é suportado por sua sintaxe, e não por uma biblioteca ou açúcar sintático. por exemplo, classes em C não são de primeira classe

Jiang Qiu
fonte
0

Simples em JavaScript, funções são objetos de primeira classe, ou seja, funções são do tipo Objeto e podem ser usadas de maneira de primeira classe como qualquer outro objeto (String, Array, Number, etc.), pois são objetos de fato si mesmos. Eles podem ser “armazenados em variáveis, passados ​​como argumentos para funções, criados dentro de funções e retornados de funções

Santi
fonte