Apa yang dimaksud dengan 'objek kelas satu'?

Jawaban:

179

Mengutip Wikipedia :

Dalam ilmu komputer, bahasa pemrograman dikatakan mendukung fungsi kelas (atau fungsi literal) jika memperlakukan fungsi sebagai objek kelas satu. Secara khusus, ini berarti bahwa bahasa tersebut mendukung pembangunan fungsi baru selama pelaksanaan suatu program, menyimpannya dalam struktur data, meneruskannya sebagai argumen ke fungsi lain, dan mengembalikannya sebagai nilai dari fungsi lain.

Halaman ini juga menggambarkannya dengan indah:

Sungguh, sama seperti variabel lainnya

  • Fungsi adalah turunan dari tipe objek
  • Fungsi dapat memiliki properti dan memiliki tautan kembali ke metode konstruktornya
  • Anda dapat menyimpan fungsi dalam suatu variabel
  • Anda dapat meneruskan fungsi sebagai parameter ke fungsi lain
  • Anda dapat mengembalikan fungsi dari suatu fungsi

juga membaca komentar TrayMan, menarik ...

Sander Versluys
sumber
11
Mengutip wikipedia bagus dan keren, tetapi uraiannya ditulis dalam bahasa untuk ilmuwan dan bukan untuk Geeks. Apa sih artinya semua itu? Kalimat terakhir dalam kutipan itu tidak jelas.
Spoike
1
@Seperti, true ... disediakan sumber daya javascript.
Sander Versluys
16
Mudahnya sebuah bahasa yang memiliki fungsi kelas satu juga memiliki fungsi tingkat tinggi, dan tidak terbatas pada fungsi tingkat pertama, yang akan mengesampingkan fungsi kelas satu. (Meskipun tingkat tinggi, tidak kelas mungkin.)
TrayMan
5
Saya tidak menemukan apa pun yang tidak jelas dalam kutipan Wikipedia, tetapi tautan tambahannya sangat bagus.
ProfK
4
Tautan tidak berfungsi lagi (setelah sekitar 8 tahun).
doubleOrt
47

Gagasan "fungsi kelas satu" dalam bahasa pemrograman diperkenalkan oleh ilmuwan komputer Inggris Christopher Strachey pada 1960-an. Formulasi paling terkenal dari prinsip ini mungkin dalam Struktur dan Interpretasi Program Komputer oleh Gerald Jay Sussman dan Harry Abelson:

  • Mereka dapat dinamai dengan variabel.
  • Mereka dapat diteruskan sebagai argumen untuk prosedur.
  • Mereka dapat dikembalikan sebagai hasil dari prosedur.
  • Mereka dapat dimasukkan dalam struktur data.

Pada dasarnya, ini berarti bahwa Anda dapat melakukan semua fungsi yang dapat Anda lakukan dengan semua elemen lain dalam bahasa pemrograman. Jadi, dalam kasus JavaScript, ini berarti bahwa semua yang dapat Anda lakukan dengan Integer, String, Array, atau objek lain apa pun, Anda juga dapat melakukannya dengan fungsi.

Jörg W Mittag
sumber
14

Persetujuan yang lebih lengkap dari formulasi Strachey-Sussman-Abelson. Jadi jika bahasa Anda mendukung konstruksi seperti itu maka Anda memiliki fungsi sebagai bahasa kelas satu :)

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

Singkatnya, apa pun adalah objek kelas satu jika bertindak dalam bahasa sebagai jenis manipulasi objek atau tipe objek. Hanya sesuatu yang dapat Anda operasikan dan sampaikan pernyataan serta evaluasi dalam ekspresi pada saat yang bersamaan. Atau bahkan lebih pendek: ketika Anda dapat menganggap suatu fungsi sebagai objek yang dapat dipanggil secara tambahan.

Arman McHitarian
sumber
9

Fungsi JavaScript adalah fungsi kelas satu yang berarti fungsi dan objek diperlakukan sebagai hal yang sama. Fungsi dapat disimpan sebagai variabel di dalam objek atau array serta dapat dilewatkan sebagai argumen atau dikembalikan oleh fungsi lain. Itu membuat fungsi "warga negara kelas satu dalam JavaScript"

JavaScript menggunakan sintaksasi notasi literal yang membuatnya sulit untuk sepenuhnya memahami fakta bahwa dalam fungsi JavaScript adalah objek.

Sebagai contoh..

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

kedua deklerasinya setara. Dengan menggunakan newkita memanggil fungsi konstruktor suatu Objek. Juga dengan menggunakan {}(pintasan JavaScript yang disebut literal) kami memanggil fungsi konstruksi suatu Objek. {}hanyalah representasi yang lebih pendek untuk membuat instance konstruktor.

Sebagian besar bahasa menggunakan newkata kunci untuk membuat objek, jadi mari kita buat objek JavaScript.

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

Seperti yang Anda lihat, kami membuat fungsi nama objek .

Membuat fungsi nama objek yang sama menggunakan ekspresi fungsi JavaScript ..

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

Di sini kita pergi, kita baru saja membuat fungsi nama objek.

Mark Adler
sumber
9

Dalam fungsi javascript adalah objek kelas satu karena dapat melakukan lebih banyak dari apa yang dapat dilakukan objek.

  • Fungsi adalah turunan dari tipe objek.

Function instanceof Object //returns true

Seperti objek, fungsi dapat memiliki properti dan dapat memiliki tautan kembali ke fungsi konstruktornya.

 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 

  • Fungsi dapat disimpan dalam variabel sebagai nilai.

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

  • Fungsi dapat diteruskan sebagai argumen ke fungsi lain

function callback (foo){
      foo();
}

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

  • Anda dapat mengembalikan suatu fungsi dari suatu fungsi

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

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

  • Dapat disimpan dalam variabel sebagai referensi.

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

Sagar Munjal
sumber
Sebuah objek dapat melakukan semua itu juga.
doubleOrt
5

Tes sederhana. Jika Anda dapat melakukan ini dalam bahasa Anda (Python sebagai contoh):

def double(x):
    return x*x

f = double

print f(5) #prints 25

Bahasa Anda memperlakukan fungsi sebagai objek kelas satu.

Yuval Adam
sumber
3
Tapi saya bisa melakukan ini di C ++: int dua kali (int x) {return x << 1; } int (* f) (int) = dua kali; std :: cout << (* f) (5) << std :: endl; Apakah itu berarti C ++ memperlakukan fungsi sebagai objek kelas satu (dengan sintaks lucu)?
Thomas L Holaday
1
Sampai Anda dapat membuat fungsi di dalam suatu fungsi, saya ingin mengatakan tidak.
cHao
1
Pointer fungsi C mendukung (definisi yang sangat terbatas) fungsi kelas satu tetapi fungsi bukan objek. Pointer fungsi dalam C tidak mengandung status atau perilaku.
Steven Kramer
2

Ini berarti bahwa fungsi adalah objek, dengan tipe dan perilaku. Mereka dapat dibangun secara dinamis, diedarkan sebagai objek lain, dan fakta bahwa mereka dapat dipanggil adalah bagian dari antarmuka mereka.

cadrian
sumber
2

Ini berarti bahwa fungsi sebenarnya diturunkan dari Object. Sehingga Anda bisa menyebarkannya dan bekerja dengannya seperti dengan objek lain.

Namun dalam c # Anda perlu menahan diri untuk tidak mendelegasikan atau merefleksikan fungsi. (ini menjadi jauh lebih baik baru-baru ini dengan ekspresi lambda)

Rashack
sumber
2

Definisi di situs Mozilla ringkas dan jelas. Menurut mereka,

Dalam JavaScript, fungsi adalah objek kelas satu, karena mereka dapat memiliki properti dan metode sama seperti objek lainnya . Yang membedakan mereka dari objek lain adalah fungsinya bisa disebut. Singkatnya, mereka adalah objek Fungsi.

Dan

suatu fungsi adalah "subprogram" yang dapat dipanggil dengan kode eksternal (atau internal dalam kasus rekursi) ke fungsi tersebut. Seperti program itu sendiri, fungsi terdiri dari urutan pernyataan yang disebut fungsi tubuh. Nilai dapat diteruskan ke fungsi, dan fungsi akan mengembalikan nilai.

Arpit
sumber
0

Saya kira ketika sesuatu adalah kelas pertama dalam suatu bahasa, itu berarti bahwa itu didukung oleh sintaks daripada perpustakaan atau gula sintaksis. misalnya, kelas dalam C bukan kelas satu

Jiang Qiu
sumber
0

Sederhana dalam JavaScript, fungsi adalah objek kelas satu, fungsi adalah objek tipe dan mereka dapat digunakan dengan cara kelas satu seperti objek lain (String, Array, Number, dll.) Karena mereka sebenarnya adalah objek diri. Mereka dapat “disimpan dalam variabel, diteruskan sebagai argumen ke fungsi, dibuat di dalam fungsi, dan dikembalikan dari fungsi

Santi
sumber