SORU
6 Kasım 2014, PERŞEMBE


JS nesneleri tanımlama bu şekilde herhangi bir amacı var mı?

Bazı eski kod takınıyorum ve nesneleri tanımlamak için aşağıdaki Şablonu olduğunu fark ettim:

var MyObject = {};

(function (root) {

    root.myFunction = function (foo) {
        //do something
    };

})(MyObject);

Bu herhangi bir amaç var mı? Sadece aşağıdakileri yapmakla eşdeğerdir?

var MyObject = {

    myFunction : function (foo) {
        //do something
    };

};

Benim beğenisine bütün kod tabanı yeniden oluşturulması için kutsal bir macera atılmak üzereyim, ama gerçekten tanımlayan nesneleri bu dolambaçlı yolu arkasındaki nedeni anlamak istiyorum.

Teşekkürler!

CEVAP
6 Kasım 2014, PERŞEMBE


Modül desen http://toddmotto.com/mastering-the-module-pattern/ deniyor

Ana nedeni gerçekten özel yöntemleri ve değişkenleri oluşturmak için. Sizin durumunuzda, herhangi bir uygulama ayrıntıları saklanıyor çünkü anlamlı değil.

İşte mantıklı modül desen kullanmak için yaptığı bir örnek.

var MyNameSpace = {};

(function(ns){
    // The id variable is hidden from the outside world
    var id = 0;

    // So is this function
    function adder(val) {
       return val   1;
    }

    ns.getNext = function (val) {
       return id = adder(val);
    }
})(MyNameSpace);

var id = MyNameSpace.getNext(); // 1
var otherId = MyNameSpace.getNext(); // 2
var otherId = MyNameSpace.getNext(); // 3

Eğer sadece düz bir nesne kullanıldığında ise, adder id halka açık olacak

var MyNameSpace = {
    id: 0,
    adder: function(val) {
       return val   1;
    },
    getNext: function() {
       return this.id = this.adder(this.id);
    }
}

Ve bir şeyler yaparak böyle kırabilirsin

MyNameSpace.getNext(); // 1
MyNameSpace.id = 0;
MyNameSpace.getNext(); // 1 again
delete MyNameSpace.adder;
MyNameSpace.getNext(); // error undefined is not a function

Ama modülü sürümü ile

MyNameSpace.getNext(); // 1
 // Is not affecting the internal id, it's creating a new property
MyNameSpace.id = 0;
MyNameSpace.getNext(); // 2, yessss
// Is not deleting anything
delete MyNameSpace.adder;
MyNameSpace.getNext(); // no problemo, outputs 3

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Arun Kumar

    Arun Kumar

    18 Mart 2010
  • technodromeband's channel

    technodromeb

    28 NİSAN 2011
  • theKGB65

    theKGB65

    24 Aralık 2007