Låt oss enas om en sak: JavaScript som ensam enhet har ibland hål i sina implementationer. När ett sådant hål stöts på kan man välja att fly eller att täppa till hålet. Jag delar här med mig av två åtgärder som gör JavaScript-utveckling litet mer angenämt.
I båda fallen utökas prototyper med nya egenskaper istället för att skapa en global funktion.
String.chunk()¶
Chunks innebär i sammanhanget att en stor mängd delas upp i mindre, mer lätthanterliga mängder. Jag får ibland det behovet med strängar, där jag tex vill sätta mellanslag i 1250500kr för att göra summan mer lättläst.
Följande kodrader ger oss den möjligheten:
String.prototype.chunk = function(n) {
if (typeof n=='undefined') n=2;
return this.match(RegExp('.{1,'+n+'}','g'));
};
Då detta är en funktion som ska funka till strängar är det klokt att lägga funktionen till String-objektets prototype istället för att göra det till en global funktion. Det gör scriptandet mer konsekvent och placerar funktionen till rätt forum.
Plockas ettan ut i talet 1250500kr går det att stoppa in mellanslagen mycket rättframt.
var price = '1250500';
price = price.charAt(0) + ' ' + price.slice(1).chunk(3).join(' ');
Date.getWeek()¶
Date-objektet har en del trevliga egenskaper mot ett angivet datum. Objektet fattas dock stöd för att plocka ut aktuell vecka på ett år. Jag har stött på det behovet ett antal gånger, då särskilt när jag utvecklat badges med veckointervall.
Det är dock inte kärnfysik att få till en kompletterande funktion.
Date.prototype.getWeek = function() {
var onejan = new Date(this.getFullYear(),0,1);
return Math.ceil((((this - onejan) / 86400000) + onejan.getDay())/7);
}
Återigen, det finns inget skäl att lägga en sådan funktion globalt. Den kommer inte att funka på något annat än datum och blir därför en metod i Date-objektets prototype, vilket gör det konsekvent att använda.
var today = new Date();
alert(today.getWeekDay()); // 1
alert(today.getWeek()); // 14
Scripten kan anropas när som helst, men lämpar sig troligtvis bäst längst upp i en JS-fil som anropas tidigt.