Eller: Hvordan begrænser man virkeområdet for sine klasser i JavaScript?
Bruger du mit jsCoreExtensions, eller prototyper du Array eller Object i dine JavaScript, så vil du på et eller andet tidspunkt løbe ind i det problem jeg taler om her (hvis du da ikke allerede er det).
Hvis du f.eks. bruger en for(in) løkke, eller kalder Array.push, så får du Objektet understøtter ikke denne metode fejl. Fejlen opstår når man laver udviddelser til Array via prototype egenskaben. Så er arrayen nemlig ikke længere at betragte som en array, men som et objekt. Derfor har man ikke længere de specielle metoder fra array objektet til rådighed. Hvad gør man så, hvis man bruger mit lille bibliotek for at kunne “LINQ’e” i JavaScript?
myArray
.where("itm.age > 35")
.select(function(itm){
return {
name: itm.name,
isApproved : true
};
});
Her kan vi ikke nøjes med at namespace sig ud af problemerne. Man har brug for at indkredse sit virkeområde, og fremstille en ny klasse (objekt). Mine array extensions er inspireret af LINQ, og bruger derfor method-chaining, for at opnå den “rigtige” LINQ feel. Mit nye objekt skal altså returnerer en instans af sig selv ved hver metodekald:
var Chain = function(array) {
// privat medlem
var _array = array;
return {
metode1: function(arg) {
// Impl. af metode 1 funktionalitet der arbejder med _array
// returner frisk Chain
return new Chain(_array);
},
metode2: function(arg) {
// Impl. af metode 2 funktionalitetder arbejder med _array
// returner frisk Chain
return new Chain(_array);
}
}
}
På den måde får man pakket sin array logik ind, og man får ikke problemer med 3. parts kode, der arbejder med Arrays. Det eneste minus ved dette mønster, er at man nu er tvunget til at konstruerer et nyt objekt, for at kunne benytte funktionaliteten:
var myArray = [1, 2, 3, 6, 9 ,8];
// Tidligere:
myArray.metode1().metode2();
// Med indkapsling
var chain = new Chain(myArray);
chain.metode2().metode1();
Den pris finder jeg lille nok til at jeg nu vil implementerer det på mine Array-prototype-extensions. Da man så ikke længere kan kalde metoderne for core-extensions, vil jeg flytte dem ud af jsCoreExtensions, og ind i et nyt array-linq bibliotek. Jeg vender tilbage når arbejdet er afprøvet.
Code on…