И вот так,
var $ = function (selector){
this.tags = document.querySelectorAll(selector);
никогда не делай.
Если уж используешь эту клоунаду, сначала рекурсивный вызов через new, а уже потом присваивание. Например,
$=function(selector){
if (!(this instanceof $)) return new $(selector);
this.tags = document.querySelectorAll(selector);
...
а в твоем случае, this===window, соответственно, ты туда срешь.