¿Qué se entiende por 'objeto de primera clase'?

Respuestas:

179

Para citar Wikipedia :

En informática, se dice que un lenguaje de programación admite funciones de primera clase (o función literal) si trata las funciones como objetos de primera clase. Específicamente, esto significa que el lenguaje permite construir nuevas funciones durante la ejecución de un programa, almacenarlas en estructuras de datos, pasarlas como argumentos a otras funciones y devolverlas como los valores de otras funciones.

Esta página también lo ilustra maravillosamente:

Realmente, como cualquier otra variable

  • Una función es una instancia del tipo de objeto
  • Una función puede tener propiedades y tiene un enlace a su método constructor
  • Puedes almacenar la función en una variable
  • Puede pasar la función como parámetro a otra función
  • Puede devolver la función desde una función

También lea el comentario de TrayMan, interesante ...

Sander Versluys
fuente
11
Citar wikipedia es agradable y elegante, pero la descripción está escrita en un lenguaje para científicos y no para geeks. ¿Qué diablos significa todo eso de todos modos? La última oración en esa cita es vagu.
Spoike 01 de
1
@Spoike, verdadero ... recurso javascript provisto.
Sander Versluys
16
Convenientemente, un lenguaje que tiene funciones de primera clase también tiene funciones de orden superior, en lugar de limitarse a funciones de primer orden, que descartarían funciones de primera clase. (Aunque de orden superior, no es posible la primera clase).
TrayMan
55
No encontré nada confuso en la cita de Wikipedia, pero el enlace adicional es excelente.
ProfK
44
El enlace ya no funciona (después de unos 8 años).
doubleOrt
47

La noción de "funciones de primera clase" en un lenguaje de programación fue introducida por el científico informático británico Christopher Strachey en la década de 1960. La formulación más famosa de este principio se encuentra probablemente en Estructura e interpretación de programas de computadora por Gerald Jay Sussman y Harry Abelson:

  • Pueden ser nombrados por variables.
  • Se pueden pasar como argumentos a los procedimientos.
  • Pueden ser devueltos como resultado de los procedimientos.
  • Pueden incluirse en estructuras de datos.

Básicamente, significa que puede hacer con funciones todo lo que puede hacer con todos los demás elementos en el lenguaje de programación. Así, en el caso de JavaScript, que significa que todo lo que puede hacer con un entero, una cadena, una matriz o cualquier otro tipo de objeto, puede también ver con las funciones.

Jörg W Mittag
fuente
14

Aprobación más completa de la formulación de Strachey-Sussman-Abelson. Entonces, si su idioma admite tal construcción, entonces tiene una función como lenguaje de primera clase :)

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

En resumen, cualquier cosa es un objeto de primera clase si actúa en el lenguaje como un tipo de objeto de manipulación de estado o tipo de objeto. Simplemente algo en lo que puede operar y pasar declaraciones y evaluarlas en expresiones al mismo tiempo. O incluso más breve: cuando puede pensar en una función como un objeto que puede invocarse adicionalmente.

Arman McHitarian
fuente
9

Las funciones de JavaScript son funciones de primera clase, lo que significa que las funciones y los objetos se tratan como lo mismo. Las funciones se pueden almacenar como una variable dentro de un objeto o una matriz, así como se puede pasar como un argumento o ser devuelto por otra función. Eso hace que la función sea "ciudadanos de primera clase en JavaScript"

JavaScript utiliza la sintaxis de notación literal, lo que dificulta comprender completamente el hecho de que en JavaScript las funciones son objetos.

Por ejemplo..

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

ambas declinaciones son equivalentes. Al usar new, estamos llamando a la función constructora de un objeto. También mediante el uso de {}(acceso directo de JavaScript llamado literales) estamos llamando a la función de construcción de un objeto. {}es solo una representación más corta para crear instancias del constructor.

La mayoría de los idiomas usan newpalabras clave para crear un objeto, por lo tanto, creemos un objeto JavaScript.

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

Como puede ver, creamos una función de nombre de objeto .

Crear la misma función de nombre de objeto usando la expresión de función de JavaScript.

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

Aquí vamos, acabamos de crear una función de nombre de objeto.

Mark Adler
fuente
9

En javascript las funciones son objetos de primera clase porque puede hacer mucho más de lo que pueden hacer los objetos.

  • Una función es una instancia de un tipo de objeto.

Function instanceof Object //returns true

Al igual que un objeto, una función puede tener propiedades y puede tener un enlace a su función constructora.

 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 

  • Las funciones se pueden almacenar en una variable como un valor.

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

  • Las funciones se pueden pasar como argumentos a otras funciones

function callback (foo){
      foo();
}

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

  • Puede devolver una función desde una función

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

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

  • Se puede almacenar en una variable como referencia.

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

Sagar Munjal
fuente
Un objeto puede hacer todo eso también.
doubleOrt
5

Prueba simple Si puede hacer esto en su idioma (Python como ejemplo):

def double(x):
    return x*x

f = double

print f(5) #prints 25

Su lenguaje trata las funciones como objetos de primera clase.

Yuval Adam
fuente
3
Pero puedo hacer esto en C ++: int dos veces (int x) {return x << 1; } int (* f) (int) = dos veces; std :: cout << (* f) (5) << std :: endl; ¿Eso significa que C ++ trata las funciones como objetos de primera clase (con una sintaxis divertida)?
Thomas L Holaday
1
Hasta que pueda crear una función dentro de una función, quiero decir que no.
cHao
1
Los punteros de función C admiten (una definición muy limitada de) funciones de primera clase, pero las funciones no son objetos. Los punteros de función en C no contienen estado ni comportamiento.
Steven Kramer
2

Significa que las funciones son objetos, con un tipo y un comportamiento. Se pueden construir dinámicamente, pasar como cualquier otro objeto, y el hecho de que se les pueda llamar es parte de su interfaz.

cadrian
fuente
2

Significa que la función en realidad hereda de Object. Para que pueda pasarlo y trabajar con él como con cualquier otro objeto.

Sin embargo, en c # debe abstenerse de delegar o reflexionar para jugar con las funciones. (Esto mejoró mucho recientemente con expresiones lambda)

Rashack
fuente
2

La definición en el sitio de Mozilla es concisa y clara. Según ellos

En JavaScript, las funciones son objetos de primera clase, porque pueden tener propiedades y métodos como cualquier otro objeto . Lo que los distingue de otros objetos es que se pueden llamar funciones. En resumen, son objetos de función.

Y

una función es un "subprograma" que puede ser llamado por código externo (o interno en el caso de recursividad) a la función. Al igual que el programa en sí, una función se compone de una secuencia de declaraciones llamada cuerpo de la función. Los valores se pueden pasar a una función, y la función devolverá un valor.

Arpit
fuente
0

Supongo que cuando algo es de primera clase en un idioma, significa que es compatible con su sintaxis en lugar de una biblioteca o azúcar sintáctico. por ejemplo, las clases en C no son de primera clase

Jiang Qiu
fuente
0

Simple en JavaScript, las funciones son objetos de primera clase, es decir, las funciones son del tipo Objeto y se pueden usar de manera de primera clase como cualquier otro objeto (String, Array, Number, etc.) ya que en realidad son objetos sí mismos. Pueden "almacenarse en variables, pasarse como argumentos a funciones, crearse dentro de funciones y devolverse de funciones

Santi
fuente