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

  • girleffect

    girleffect

    20 Mayıs 2008
  • midomansour

    midomansour

    19 EYLÜL 2009
  • Videogamerz | Call of Duty

    Videogamerz

    5 NİSAN 2012