SORU
14 EYLÜL 2010, Salı


JavaScript arabirim türü var mı (Java'In 'arayüzü gibi')?

how to make OOP with JavaScript öğreniyorum. Arayüz kavramı (interface Java gibi) var mı?

Bir dinleyici oluşturmak mümkün olacaktır

CEVAP
14 EYLÜL 2010, Salı


Kavramı yok "bu sınıf, bu işlevleri olmalıdır" (yani, kendi başına hiçbir arabirimleri), çünkü:

  1. JavaScript miras nesneler, sınıflar temelinde değil. Sen fark edene kadar büyütülecek bir şey değil:
  2. JavaScript birson derecedinamik dil -- yazılan bu arayüz için uygun hale getiren, uygun yöntem, bir nesne oluşturabilirsinizve sonra da buna uygun yapılmış olan her şeyi, tanımsız. Yazın sistemi yıkmak için çok kolay hatta yanlışlıkla olur! buna değer deneyin ve ilk etapta tür bir sistem yapmak olmaz.

Bunun yerine, JavaScript duck typing denir ne kullanır. Eğer ördek gibi yürüyorsa, ördek, bildiğim kadarıyla JS gibi şarlatanlar umurunda değilse (ki ördek.) Eğer nesne var vak(), yürüyüş () ve sinek() yöntemleri, kodu kullanabilir her yerde bekleyen bir nesne yürüyebilecek, vak, ve sinek, gerektirmeden uygulanması bazı "Duckable" arayüzü. Arayüzü tam olarak kod kullanan işlevler ve bu işlevlerin dönüş değerleri) ayarlanır ve ördek yazarak, bedava.

Şimdi, bu kod eğer some_dog.quack(); Eğer data alacaksın aramak için çalışırsanız yarısında başarısız olmayacak demek değil. Açıkçası, eğer söylediğin köpekler için şarlatan, sen biraz daha büyük sorunları; ördek yazma eserleri en iyi şekilde devam edersen tüm ördekler bir satır, tabiri caizse, ve değil izin köpekler ve ördekler karıştırmak birlikte sürece sen su çiçeği genel olarak hayvanlar. Arayüzü akıcı olsa bile, diğer bir deyişle, hala orada; sık sık şarlatan ve ilk etapta uçmak için beklediği kodu için bir köpek geçmek için bir hata.

Ama eğer doğru şeyi yaptığına emin değilseniz, kullanmak için denemeden önce belirli bir yöntemin varlığı için test ederek dırdırları-köpek soruna geçici bir çözüm. Gibi bir şey

if (typeof(someObject.quack) == "function")
{
    // This thing can quack
}

Kullanmadan önce kullanabileceğiniz tüm yöntemleri için kontrol edebilirsiniz. Sözdizimi biraz çirkin ama. Biraz daha güzel bir yolu var:

Object.prototype.can = function(methodName)
{
     return ((typeof this[methodName]) == "function");
};

if (someObject.can("quack"))
{
    someObject.quack();
}

Bu herhangi bir JS yorumlayıcısı kullanarak değer içinde çalışması gerektiğini çok standart JavaScript. İngilizce gibi okumaya yararı vardır.

Modern tarayıcılar için (yani, hemen hemen herhangi bir tarayıcı IE 6-8 dışında), hatta for...in gösterilmesini özelliği tutmak için bir yol var:

Object.defineProperty(Object.prototype, 'can', {
    enumerable: false,
    value: function(method) {
        return (typeof this[method] === 'function');
    }
}

Sorun IE 7 nesneleri .defineProperty Hiç Yok, IE8, iddialara göre sadece ana nesneler (DOM elemanları ve bu gibi) çalışır. Eğer uyumluluk sorunu varsa, .defineProperty kullanamazsınız. (Hatta daha önemsiz Çin dışında artık çünkü IE6, bahsetmeyeceğim.)

Başka bir sorun, bazı kodlama stilleri herkes kötü kod yazar ve birine körü körüne for...in kullanmak istiyor diye Object.prototype değiştirme yasaklamak varsaymak gibi. Eğer bu konuda, ya da kullanma (IMO . ilgilenirsen ^em>kırıkbiraz farklı bir sürüm deneyin kod:

function can(obj, methodName)
{
     return ((typeof obj[methodName]) == "function");
}

if (can(someObject, "quack"))
{
    someObject.quack();
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damien Hayes

    Damien Hayes

    11 Mart 2008
  • Flohoo

    Flohoo

    12 EYLÜL 2009
  • Garrett Müller

    Garrett Mül

    26 HAZİRAN 2009