SORU
1 HAZİRAN 2012, Cuma


Nasıl javascript fonksiyonları aşırı yükleme için?

Aşırı klasik (non-js) yaklaşım:

function myFunc(){
 //code
}

function myFunc(overloaded){
 //other code
}

Javascript alışkanlık birden fazla işlev tanımlanabilir aynı adı taşıyan edelim. Gibi şeyler bu ortaya gibi:

function myFunc(options){
 if(options["overloaded"]){
  //code
 }
}

Javascript içinde fonksiyon aşırı yükleme için daha iyi bir çözüm içinde aşırı bir nesne geçen başka var mı?

Aşırı hızla geçen bir işlevi, her bir olası aşırı sonra koşullu bir açıklama gerekir, çünkü fazla ayrıntılı hale gelmesine neden olabilir. Bu fonksiyonları koşullu ifadeler //code içini yapmak için kullanmayı kapsamları ile zor durumlara neden olabilir.

CEVAP
1 HAZİRAN 2012, Cuma


Çünkü javascript hiçbir türünü kontrol değişkenleri veya gerekli miktar bağımsız, sadece bir uygulama myFunc() bu uyum ne argümanlarınız iletilmiş tarafından kontrol tipi, varlığı ya da miktarı bağımsız değişken.

jQuery bunu her zaman yapar. Bağımsız değişken isteğe bağlı yapabilirsiniz veya işlev geçirilir ne bağlı şube.

Aşırı bu tür uygulamada, kullanabileceğiniz birkaç farklı teknikler vardır:

  1. Eğer bildirilen değişken adı değeri undefined olup olmadığını görmek için kontrol ederek herhangi bir tartışmanın varlığı için kontrol edebilirsiniz.
  2. arguments.length ile toplam miktarı değişkenleri kontrol edebilirsiniz.
  3. Herhangi bir bağımsız değişken türü kontrol edebilirsiniz.
  4. Bağımsız değişken numarası için arguments sözde dizi arguments[i] ile herhangi bir değişken erişmek için kullanabilirsiniz.

İşte bazı örnekler:

JQuery bir göz atalım obj.data() yöntemi. Kullanım dört farklı biçimleri destekler:

obj.data("key");
obj.data("key", value);
obj.data();
obj.data(object);

Her biri farklı bir davranışı tetikler ve aşırı yükleme bu dinamik form kullanmadan, dört ayrı işlevleri gerektirir.

Burada bir İngilizce tüm bu seçenekler arasında ayırt nasıl ve kod onları birleştirmek olacak o zaman:

// get the data element associated with a particular key value
obj.data("key");

İlk bağımsız değişken .data() geçirilen bir dize ve ikinci bağımsız değişken undefined, daha sonra ise arayan kişi bu formu kullanarak olmalıdır.


// set the value associated with a particular key
obj.data("key", value);

Eğer ikinci argüman tanımsız ise, o zaman belirli bir anahtar değerini ayarlayın.


// get all keys/values
obj.data();

Eğer herhangi bir argüman geçirilen, döndürülen bir nesne değerleri/tüm anahtarları döndürür.


// set all keys/values from the passed in object
obj.data(object);

Eğer ilk bağımsız değişkenin türü düz bir nesne ise, bu nesnenin değerlerini/tüm anahtarları ayarlayın.


Javascript mantık seti ile hepsini birleştirebilirsiniz.

 // method declaration for .data()
 data: function(key, value) {
     if (arguments.length === 0) {
         // .data()
         // no args passed, return all keys/values in an object
     } else if (typeof key === "string") {
         // first arg is a string, look at type of second arg
         if (typeof value !== "undefined") {
             // .data("key", value)
             // set the value for a particular key
         } else {
             // .data("key")
             // retrieve a value for a key
         }
     } else if (typeof key === "object") {
         // .data(object)
         // set all key/value pairs from this object
     } else {
         // unsupported arguments passed
     }
 },

Bu tekniğin anahtarı kabul etmek isteyip istemediğiniz tartışmalar tüm formları tespit edilebileceğini olduğundan emin olmak için ve hiç arayanın kullandığı hakkında herhangi bir karışıklık var. Bu her zaman kullanılan söyleyebilirsin genellikle uygun şekilde argümanlar sipariş ve bağımsız değişkenlerin tipi ve konumu yeterince teklik vardır emin olmak gerekir.

Eğer bir işlevi varsa, örneğin, bu üç dize değişkenleri alır:

obj.query("firstArg", "secondArg", "thirdArg");

Sen-ebilmek kolayca yapmak üçüncü argüman isteğe bağlı ve kolayca tespit bu durum, ama siz yapamazsınız, yalnızca ikinci argümanı isteğe bağlı çünkü söyleyemezsin bu arayanın demek için geçen bir yol yoktur çünkü tanımlamak eğer ikinci argümanı olması gerektiği gibi, ikinci bağımsız değişken ikinci bağımsız değişken olduğunu ihmal nedir ikinci tartışma yeri aslında üçüncü argüman:

obj.query("firstArg", "secondArg");
obj.query("firstArg", "thirdArg");

Her üç değişken aynı tipte olduğu için arayan amaçlanan ne olduğunu bilmiyorsun çok farklı değişkenleri ayırt edemezsin. Bu arama tarzı ile, sadece üçüncü argüman isteğe bağlı olabilir. Eğer ikinci argüman atlamak istiyorsan, null gibi geçti (veya başka bir tespit değeri) yerine olmalı ve kodu olduğunu tespit eder:

obj.query("firstArg", null, "thirdArg");

İşte isteğe bağlı bağımsız bir WordPress kullanmak bir örnek. her iki bağımsız değişken isteğe bağlıdır ve varsayılan değerleri kabul değilse geçti:

clone: function( dataAndEvents, deepDataAndEvents ) {
    dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
    deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;

    return this.map( function () {
        return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
    });
},

İşte tartışma eksik olduğu bir WordPress kullanmak bir örnek ya da dört farklı aşırı veren üç farklı türlerden biri:

html: function( value ) {
    if ( value === undefined ) {
        return this[0] && this[0].nodeType === 1 ?
            this[0].innerHTML.replace(rinlinejQuery, "") :
            null;

    // See if we can take a shortcut and just use innerHTML
    } else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
        (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
        !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {

        value = value.replace(rxhtmlTag, "<$1></$2>");

        try {
            for ( var i = 0, l = this.length; i < l; i   ) {
                // Remove element nodes and prevent memory leaks
                if ( this[i].nodeType === 1 ) {
                    jQuery.cleanData( this[i].getElementsByTagName("*") );
                    this[i].innerHTML = value;
                }
            }

        // If using innerHTML throws an exception, use the fallback method
        } catch(e) {
            this.empty().append( value );
        }

    } else if ( jQuery.isFunction( value ) ) {
        this.each(function(i){
            var self = jQuery( this );

            self.html( value.call(this, i, self.html()) );
        });

    } else {
        this.empty().append( value );
    }

    return this;
},

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damien Hayes

    Damien Hayes

    11 Mart 2008
  • infiniTuts

    infiniTuts

    18 Ocak 2012
  • listedabive

    listedabive

    30 Ocak 2007