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?"


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


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.


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.


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.


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);


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.


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.


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)


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.


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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.