"Birinci sınıf nesne" ile ne kastedilmektedir?


147

Yakın tarihli bir soruda , diğer şeylerin yanı sıra, fonksiyonların 'birinci sınıf' nesneler olduğu JavaScript yönü hakkında konuşmak için öneriler aldım. Bu bağlamda diğer nesnelerin aksine 'birinci sınıf' ne anlama geliyor?

EDIT (Jörg W Mittag): Exact Duplicate: "Birinci sınıf programlama yapısı nedir?"


Yanıtlar:


180

Wikipedia'dan alıntı yapmak için :

Bilgisayar biliminde, bir programlama dilinin, işlevleri birinci sınıf nesneler olarak ele alırsa birinci sınıf işlevleri (veya gerçek işlevi) desteklediği söylenir. Spesifik olarak, bu, dilin bir programın yürütülmesi sırasında yeni işlevler oluşturmayı, bunları veri yapılarında depolamayı, bunları argüman olarak diğer işlevlere aktarmayı ve diğer işlevlerin değerleri olarak döndürmeyi desteklediği anlamına gelir.

Bu sayfa aynı zamanda güzel bir şekilde göstermektedir :

Gerçekten, tıpkı diğer değişkenler gibi

  • Bir işlev, Nesne türünün bir örneğidir
  • Bir işlevin özellikleri olabilir ve yapıcı yöntemine geri bağlantısı olabilir
  • Fonksiyonu bir değişkende saklayabilirsiniz
  • İşlevi bir parametre olarak başka bir işleve geçirebilirsiniz
  • İşlevi bir işlevden döndürebilirsiniz

ayrıca TrayMan'in yorumunu okuyun, ilginç ...


12
Wikipedia'dan alıntı yapmak güzel ve zekice, ancak açıklama bilim adamları için bir dilde yazılmıştır, inekler için değil. Bütün bunlar ne anlama geliyor zaten? Bu alıntıdaki son cümle vagu.
Spoike

1
@Spoike, true ... javascript kaynağı sağladı.
Sander Versluys

16
Elverişli olarak, birinci sınıf işlevlere sahip bir dil, birinci sınıf işlevleri ekarte edecek birinci dereceden işlevlerle sınırlı olmanın aksine, daha yüksek düzey işlevlere de sahiptir. (Üst düzey olsa da birinci sınıf mümkün değildir.)
TrayMan

5
Wikipedia alıntısında net olmayan bir şey bulamadım, ancak ek bağlantı mükemmel.
ProfK

5
Bağlantı artık çalışmıyor (yaklaşık 8 yıl sonra).
doubleOrt

48

Bir programlama dilinde "birinci sınıf işlevler" kavramı , 1960'larda İngiliz bilgisayar bilimcisi Christopher Strachey tarafından tanıtıldı . Bu ilkenin en ünlü formülasyonu, muhtemelen Gerald Jay Sussman ve Harry Abelson'un Bilgisayar Programlarının Yapısı ve Yorumlanması kitabında:

  • Değişkenlerle adlandırılabilirler.
  • Prosedürlere argüman olarak aktarılabilirler.
  • Prosedürlerin sonucu olarak iade edilebilirler.
  • Veri yapılarına dahil edilebilirler.

Temel olarak, programlama dilindeki diğer tüm öğelerle yapabileceğiniz her şeyi işlevlerle yapabileceğiniz anlamına gelir. Dolayısıyla, JavaScript söz konusu olduğunda, bu, bir Tamsayı, Dizge, Dizi veya diğer herhangi bir Nesne ile yapabileceğiniz her şeyi, işlevlerle de yapabileceğiniz anlamına gelir.


14

Strachey-Sussman-Abelson formülasyonunun daha eksiksiz onaylanması. Öyleyse, diliniz böyle bir yapıyı destekliyorsa , birinci sınıf bir dil olarak bir işleviniz var :)

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

Kısacası, herhangi bir şey, dilde durum manipülasyonu türü bir nesne veya nesne türü olarak hareket ediyorsa birinci sınıf bir nesnedir. Basitçe uygulayabileceğiniz ve aynı anda ifadelerde değerlendirebileceğiniz ve ifadelerde değerlendirebileceğiniz bir şey. Daha da kısası: Bir işlevi ek olarak çağrılabilecek bir nesne olarak düşünebildiğinizde.


9

JavaScript işlevleri birinci sınıf işlevlerdir, yani işlevler ve nesneler aynı şey olarak değerlendirilir. Fonksiyonlar, bir nesnenin veya bir dizinin içinde bir değişken olarak depolanabilir, ayrıca bir argüman olarak iletilebilir veya başka bir fonksiyon tarafından döndürülebilir. Bu, işlevi "JavaScript'te birinci sınıf vatandaşlar" yapar

JavaScript, birebir gösterim sözdizimi kullanır, bu da JavaScript'teki işlevlerin nesne olduğu gerçeğini tam olarak kavramayı zorlaştırır.

Örneğin..

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

her iki beyan eşdeğerdir. Kullanarak newbir Object'in yapıcı işlevini çağırıyoruz. Ayrıca {}(değişmez değerler olarak adlandırılan JavaScript kısayolu) kullanarak bir Nesnenin yapım işlevini çağırıyoruz. {}yapıcıyı örneklemek için sadece daha kısa bir temsildir.

Çoğu dil newbir nesne oluşturmak için anahtar sözcük kullanır , bu nedenle bir JavaScript nesnesi oluşturalım.

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

Gördüğünüz gibi bir nesne adı fonksiyonu oluşturduk .

JavaScript işlev ifadesini kullanarak aynı nesne adı işlevini oluşturma ..

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

İşte gidiyoruz az önce bir nesne adı işlevi oluşturduk.


9

JavaScript'te işlevler birinci sınıf nesnelerdir çünkü nesnelerin yapabileceğinden çok daha fazlasını yapabilir.

  • İşlev, Nesne türünün bir örneğidir.

Function instanceof Object //returns true

Bir nesne gibi, bir işlev de özelliklere sahip olabilir ve yapıcı işlevine geri bir bağlantı sağlayabilir.

 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 

  • Fonksiyonlar bir değişkende değer olarak saklanabilir.

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

  • Fonksiyonlar, diğer fonksiyonlara argüman olarak aktarılabilir

function callback (foo){
      foo();
}

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

  • Bir işlevden bir işlevi döndürebilirsiniz

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

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

  • Referans olarak bir değişkende saklanabilir.

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


Bir nesne de tüm bunları yapabilir.
doubleOrt

5

Basit test. Bunu kendi dilinizde yapabiliyorsanız (örneğin Python):

def double(x):
    return x*x

f = double

print f(5) #prints 25

Diliniz, fonksiyonları birinci sınıf nesneler olarak ele alıyor.


3
Ama bunu C ++ ile yapabilirim: int iki kez (int x) {dönüş x << 1; } int (* f) (int) = iki kez; std :: cout << (* f) (5) << std :: endl; Bu, C ++ 'nın işlevleri birinci sınıf nesneler olarak ele aldığı anlamına mı geliyor (komik bir sözdizimiyle)?
Thomas L Holaday

1
Bir fonksiyonun içinde bir fonksiyon oluşturana kadar hayır demek istiyorum.
cHao

1
C işlev işaretçileri birinci sınıf işlevleri destekler (çok sınırlı bir tanımdır), ancak işlevler nesne değildir. C'deki işlev işaretçileri durum veya davranış içermez.
Steven Kramer

3

Mozilla sitesindeki tanım kısa ve nettir. Onlara göre,

JavaScript'te, işlevler birinci sınıf nesnelerdir çünkü diğer nesneler gibi özelliklere ve yöntemlere sahip olabilirler . Onları diğer nesnelerden ayıran şey, işlevlerin çağrılabilmesidir. Kısaca bunlar Function nesneleridir.

Ve

bir işlev, işleve harici (veya özyineleme durumunda dahili) kodla çağrılabilen bir "alt program" dır. Programın kendisi gibi, bir işlev de işlev gövdesi adı verilen bir dizi ifadeden oluşur. Değerler bir işleve aktarılabilir ve işlev bir değer döndürür.


2

İşlevlerin bir türü ve bir davranışı olan nesneler olduğu anlamına gelir. Dinamik olarak oluşturulabilir, başka herhangi bir nesne gibi etrafından dolaştırılabilir ve çağrılabilmeleri, arayüzlerinin bir parçasıdır.


2

Bu, işlevin aslında Object'ten miras aldığı anlamına gelir. Böylece onu başka herhangi bir nesnede olduğu gibi dolaştırabilir ve onunla çalışabilirsiniz.

Ancak c # 'da işlevlerle oynamak için temsilcilerden veya düşünmekten kaçınmanız gerekir. (bu son zamanlarda lambda ifadeleriyle çok daha iyi hale geldi)


0

Sanırım bir dilde birinci sınıf bir şey olduğunda, bu bir kütüphane veya sözdizimsel şekeri yerine sözdizimi tarafından desteklendiği anlamına gelir. örneğin, C'deki sınıflar birinci sınıf değildir


0

JavaScript'te basit olan işlevler birinci sınıf nesnelerdir, yani işlevler Nesne türündedir ve aslında nesneler oldukları için diğer nesneler (Dize, Dizi, Sayı vb.) Gibi birinci sınıf bir şekilde kullanılabilirler. kendilerini. "Değişkenler içinde depolanabilir, işlevlere bağımsız değişken olarak aktarılabilir, işlevler içinde oluşturulabilir ve işlevlerden döndürülebilirler

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.