18. // partial is to curry ...
var foo = function(direction){
if(direction){ goleft(); }else{ goright(); }
}
var left = foo.curry(1),
right = dojo.partial(foo, 0)
;
left(); right();
19. // as bind is to hitch
var o = {
handler:function(response){ ... },
send:function(){
dojo.xhrPost({
url:"/the/url",
handle: dojo.hitch(this, "method")
})
}
};
o.send();
20. ALSO FOR JQUERY ...
http://higginsforpresident.net/js/static/jq.hitch.js
22. (function(d){
var oldonload = d.addOnLoad;
d.addOnLoad = d.ready = function(fn){
oldonload.call(d, d.partial(fn, d));
}
// now you can use `dojo` as whatever first
// arg to dojo.ready callback is:
//
//
dojo.ready(function(d){
//
d.require("foo.bar.Baz");
//
});
})(dojo);
24. // old api:
dojo.require(“foo.Bar”);
// new ducked apis:
dojo.require([“foo.Bar”, “bar.Baz”]);
dojo.require(“bam.Foo”).require(“omg.Really”)
.require([“oh.Right”, “doit.ThisWayToo”])
;
25. (function(d){
// replace the old dojo with a function
var d = dojo;
dojo = function(a){
if(d.isFunction(a)){
d.ready(a);
return dojo;
}else{
return d.query.apply(d, arguments);
}
}
// this is just to bother alex:
dojo.fn = d.NodeList.prototype;
// mix dojo back into itself.
for(var i in d){ dojo[i] = d[i]; }
})(dojo);
37. var dd = d.date, dp = Date.prototype,
map = {
"daysInMonth": [dd, "daysInMonth"],
"isLeapYear": [dd, "isLeapYear"],
"timezone": [dd, "getTimezoneName"],
"compare": [dd, "compare"],
"add": [dd, "add"],
"difference": [dd, "difference"],
"format": [dd.locale, "format"],
"isWeekend": [dd.locale, "isWeekend"]
}
;
// setup all the above direct mappings
var setup = function(pn, fn){
if(!dp[pn]){
var fullfn = fn[0][fn[1]];
dp[pn] = function(){
return fullfn.apply(fn[0], d._prep(this, arguments));
};
}
};
for(var i in map){ setup(i, map[i]); }
38. d._clobber(Date.prototype, {
json: function(){
// summary: Serializes a Date object as an ISO String. Helps
// when serializing a JSON string from an object containing
// Date objects.
return d.date.stamp.toISOString(this, { selector: 'date' });
}
});
d._clobber(String.prototype, {
toDate: function(options){
// summary: Convert this string into a Date object, provided it is formatted properly.
return dojo.date.locale.parse(this, options);
}
});
39. var maff = Math, np = Number.prototype;
d.forEach(
[
// a list of straight-up-shit-that-could-be-on-Number
// that would just call Math.something(this)
"abs", "acos", "asin", "atan", "atan2", "ceil", "cos", "exp", "floor", "log",
"max", "min", "pow", /* "random", "round", */ "sin", "sqrt", "tan"
],
function(meth){
// setup the function in place if it doesn't exist
// for some reason
if(!this[meth] && maff[meth]){
this[meth] = function(param){
// if we have at least one extra param, take the whole thing:
return maff[meth].apply(maff, param ? d._prep(this, arguments) : [this]);
};
}
},
np // context
);
41. Take Away:
JavaScript is fun and flexible.
The DOM is the culprit. and evil.
Because you can do something, doesn’t mean you should.
Don’t let that stop you.
Embrace the language as a whole.