Nesneye Dayalı Javascript en iyi uygulamaları? [kapalı]


251

Kendimi Javascript'te büyük bir projeyi kodlarken buluyorum. Sonuncusunun oldukça macera olduğunu hatırlıyorum, çünkü hacky JS hızla okunamaz hale geliyor ve bu kodun temiz olmasını istiyorum.

Ben bir lib oluşturmak için nesneleri kullanıyorum, ama JS, şeyler, bellek yönetimi, ad alanı, vb önemli sonuçlar ima şeyler tanımlamak için çeşitli yollar vardır EG:

  • kullanma varya da kullanma;
  • dosyadaki veya bir (function(){...})()jquery stilindeki şeyleri tanımlama ;
  • kullanma thisya da kullanma;
  • kullanılarak function myname()ya da myname = function();
  • nesnenin gövdesindeki yöntemleri tanımlama veya "prototip" kullanma;
  • vb.

Peki JS'de OO kodlaması yaparken gerçekten en iyi uygulamalar nelerdir?

Akademik açıklamalar burada bekleniyor. Kalite ve sağlamlık ile uğraştığı sürece kitaplara sıcak bir şekilde hoş geldiniz.

DÜZENLE :

Bazı okumalar aldım, ancak yukarıdaki soruların ve en iyi uygulamaların cevaplarıyla hala ilgileniyorum.


2
Belki başlığında "nesne yönelimli" yerine "modern" getirilmelidir.
viam0Zah

43
Hmmm, 79 upvotes, 82 favs, 91 cevapta upvotes ... henüz bu yapıcı değil kapatıldı ... neden ??
Brett Rossier

1
Basit ve doğal bir sözdizimi ile javascript C ++ OOP Özellikleri taşıyan basit bir sınıf yazdı. Cevabımı buradan görebilirsiniz: stackoverflow.com/a/18239463/1115652

14
Bu tür bir soru her zaman kapanır. Bunun nedenlerini anlıyorum, ancak önemli sorular oldukları ve her zaman popüler oldukları için (ve benzer bir sorum olduğunda her zaman onları bulduğumdan), merak ediyorum, kimse bizi sormak için uygun mekana yönlendirebilir mi?
KP MacGregor

2
@BrettRossier Eğer kullanmazsanız güç ne işe yarar? SO, demokratik gagalama düzeninin nasıl işlediğinin canlı bir gösterisidir. Şüphesiz bazı psikologlar içine

Yanıtlar:


288

"Var" ya da değil kullanma

Herhangi bir değişkeni varifadeyle tanıtmalısınız , aksi takdirde global kapsamı kaplar.

Katı modda ( "use strict";) bildirilmemiş değişken atamaların atıldığınıReferenceError belirtmek gerekir .

Şu anda JavaScript'in blok kapsamı yoktur. Crockford okulu size işlev gövdesinin başına var ifadeleri koymayı öğretirken , Dojo'nun Stil Kılavuzu tüm değişkenlerin mümkün olan en küçük kapsamda bildirilmesi gerektiğini okur . ( letİfade ve tanım JavaScript 1.7'de sunulan ECMAScript standardının bir parçası değildir.)

Tüm kapsam zincirine bakmaktan daha hızlı olduğu için düzenli olarak kullanılan nesnelerin özelliklerini yerel değişkenlere bağlamak iyi bir uygulamadır. ( Aşırı performans ve düşük bellek tüketimi için JavaScript'i optimize etme konusuna bakın .)

Dosyadaki veya `` (function () {...}) () `

Nesnelerinize kodunuzun dışında erişmeniz gerekmiyorsa, tüm kodunuzu bir işlev ifadesine (modül modülü olarak adlandırılır) sarabilirsiniz. Performans avantajları vardır ve ayrıca kodunuzun üst düzeyde küçültülmesini ve gizlenmesini sağlar. Ayrıca global ad alanını kirletmeyeceğinden de emin olabilirsiniz. JavaScript'teki Kaydırma İşlevleri, en boy yönelimli davranışlar eklemenize de olanak tanır. Ben Cherry'in modül modeli üzerine derinlemesine bir makalesi var .

"This" kullanmak ya da kullanmamak

JavaScript'te sözde klasik kalıtım kullanıyorsanız, kullanmaktan kaçınabilirsiniz this. Hangi kalıtım modelini kullandığınız bir zevk meselesi. Diğer durumlar için Peter Michaux'un "bu" olmadan JavaScript Widget'ları hakkındaki makalesine bakın .

`Function myname ()` veya `myname = function ();`

function myname()bir işlev bildirimidir ve myname = function();değişkene atanan bir işlev ifadesidir myname. İkinci form, işlevlerin birinci sınıf nesneler olduğunu ve değişkenle olduğu gibi onlarla her şeyi yapabileceğinizi gösterir. Aralarındaki tek fark, tüm fonksiyon bildirimlerinin belirli durumlarda önemli olabilecek kapsamın en üstünde yer almasıdır. Aksi takdirde eşittirler. function foo()steno bir formdur. Kaldırma hakkında daha fazla ayrıntı JavaScript Kapsam Belirleme ve Kaldırma makalesinde bulunabilir.

Nesnenin gövdesinde yöntem tanımlama veya "prototip" kullanma

Sana kalmış. JavaScript'in dört nesne oluşturma modeli vardır: sözde klasik, prototipik, işlevsel ve parçalar ( Crockford, 2008 ). Her birinin artıları ve eksileri vardır, video görüşmelerinde Crockford'a bakın veya Anon'un önerdiği gibi İyi Parçalar kitabını edinin .

çerçeveler

Bazı JavaScript çerçevelerini seçmenizi, kurallarını ve stillerini incelemenizi ve size en uygun uygulamaları ve modelleri bulmanızı öneririm. Örneğin, Dojo Araç Kiti , birden fazla kalıtımı bile destekleyen nesne yönelimli JavaScript kodu yazmak için sağlam bir çerçeve sağlar.

desenler

Son olarak, yaygın JavaScript kalıplarını ve anti-kalıpları araştırmaya adanmış bir blog var . Ayrıca şu soruyu da inceleyin JavaScript için kodlama standartları var mı? Taşması


1
"JavaScript dört nesne oluşturma modeli vardır: sözde klasik, prototipik, fonksiyonel ve parçalar" - Ben gerçekten artıları ve eksileri bir özetini takdir ediyorum.
BadHorsie

2
" letJavaScript 1.7'de sunulan ifade ve tanım ECMAScript standardının bir parçası değildir." Şimdi ES6'nın bir parçası.
Michał Perłakowski

13

Bu soruyu sorduğumdan beri okuduğum veya uygulamaya koyduğum bazı şeyleri yazacağım. Bu yüzden okuyan insanlar hayal kırıklığına uğramayacaklar, çünkü cevapların çoğu kılık değiştirmiş RTMF'lerdir (itiraf etmeliyim bile, önerilen kitaplar iyi).

Var kullanımı

Herhangi bir değişkenin JS'deki daha yüksek kapsamda zaten bildirilmiş olması gerekir. Bu nedenle, yeni bir değişken istediğinizde, fark etmeden küresel bir değişkeni manipüle etmek gibi kötü sürprizlerden kaçınacağını beyan edin. Bu nedenle, daima var anahtar sözcüğünü kullanın.

Bir nesne markasında özel değişkeni var. Yalnızca genel bir değişken bildirmek istiyorsanız, this.my_var = my_valuebunu kullanın .

Beyan yöntemleri

JS'de, yöntem bildirmenin sayısız yoludur. Bir OO programcısı için, en doğal ve etkili yöntem aşağıdaki sözdizimini kullanmaktır:

Nesne gövdesinin içinde

this.methodName = function(param) {

/* bla */

};

Bir dezavantajı var: komik JS kapsamı nedeniyle iç işlevler "buna" erişemez. Douglas Crockford, "that" adlı geleneksel bir yerel değişken kullanarak bu sınırlamanın atlanmasını önerir. Böylece olur

function MyObject() {

    var that = this;

    this.myMethod = function() {

        jQuery.doSomethingCrazy(that.callbackMethod);

    };

};

Otomatik hat sonuna güvenmeyin

JS ;, unutursanız satırın sonuna otomatik olarak eklemeye çalışır . Hata ayıklamak için bir karışıklık olan hatalar alacağınızdan, bu davranışa güvenmeyin.


8

İlk hakkında okumak gerektiğini prototip tabanlı programlama sen tür hayvan uğraştığın biliyorum bu yüzden ve daha sonra bakmak MDC iki JavaScript stil kılavuzu ve MDC iki JavaScript sayfası . Ben de bir araç, yani kod kalitesini zorlamak için en iyi bulabilirsiniz. JavaScript Lint veya diğer varyantlar.

OO ile ilgili en iyi uygulamalar, kod kalitesine konsantre olmaktan çok desen bulmak istediğiniz gibi geliyor, bu nedenle Google aramasına bakın: javascript desenleri ve jQuery desenleri .


5

John Resig (jQuery) tarafından JavaScript Ninja'nın Sırları'nı kontrol etmek isteyebilirsiniz . "Bu kitap, bir ara JavaScript geliştiricisi alıp ona tarayıcılar arası bir JavaScript kitaplığı oluşturmak için ihtiyaç duyduğu bilgileri yerden almayı amaçlıyor."

Taslağa yayıncıdan ulaşılabilir: http://www.manning.com/resig/

Douglas Crockford'un ana sayfasında bazı güzel JavaScript makaleleri de var: http://www.crockford.com/


5

Genellikle burada benim javascript için MooTools kullanan tek adam gibi hissediyorum.

Bu açılımı M y O Nesne O riented Araçlar, Mootools.

Javascript OOP almak gerçekten seviyorum. Onların sınıf uygulamasını jquery ile birlikte de kullanabilirsiniz, böylece jquery hendek gerekmez (mootools her şeyi de yapar).

Her neyse, ilk bağlantıya iyi bir okuma yapın ve ne düşündüğünüzü görün, ikinci bağlantı mootools belgelerine.

MooTools ve Kalıtım

MooTools Sınıfları


Bir dili size eski alışkanlığına uydurmak için bükmeye çalışmak iyi bir şey değil. C'deki bu insanlar gibi, yerine # kullanarak fortran gibi görünüyor yapmak için. . Gerçekten, bunu değiştirmek şekilde çalıştığıyla (ve en iyi practicesà öğrenmek ve ona çok fazla rahatsız biçimini kullanmak Ama denemek gerektiğini düşünüyorum.
E-satis

2
Bence MooTools nesne sistemi oldukça zarif ve kodumu düzenli tutmamı sağlıyor.
awesomo

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.