Skip to content

Instantly share code, notes, and snippets.

@teramako
Created February 22, 2011 15:39
Show Gist options
  • Save teramako/838844 to your computer and use it in GitHub Desktop.
Save teramako/838844 to your computer and use it in GitHub Desktop.
only Firefox4, E4X hack:: Namespace accessor
/*
// Example::
(function(ns){
ns.foo = "abc";
// => window["teramako.github.com::foo"] == "abc"
})(NS("github", "teramako.github.com"));
*/
function NS (name, uri, target) {
if (!target)
target = this;
var ns = new Namespace(name, uri);
var prefix = uri + "::";
if (!NS[name]) {
Object.defineProperty(NS, name, {
value: ns,
writable: false,
});
}
function filter (keys) {
var result = [];
for (var i = 0, len = keys.length; i < len; i++) {
if (keys[i].indexOf(prefix) == 0) {
result.push(keys[i].substr(prefix.length));
}
}
return result;
}
return Proxy.create({
getOwnPropertyDescriptor: function (name) {
var desc = Object.getOwnPropertyDescriptor(target, prefix + name);
if (desc !== void(0)) { desc.configurable = true; }
return desc;
},
getOwnPropertyNames: function () {
return filter(Object.getOwnPropertyNames(target));
},
keys: function () {
return filter(Object.keys(target));
},
defineProperty: function (name, desc) {
Object.defineProperty(target, prefix + name, desc);
},
delete: function (name) {
return delete target.ns::[name];
},
fix: function () {
if (Object.isFrozen(target)) {
return filter(Object.getOwnPropertyNames(target)).map(function(name) {
return Object.getOwnPropertyDescriptor(target, prefix + name);
});
}
return void(0);
},
enumerate: function () {
return filter(Object.keys(target));
},
get: function(p, name) {
return target.ns::[name];
},
set: function (p, name, value){
return target.ns::[name] = value;
},
has: function (name) {
return prefix + name in target;
},
hasOwn: function (name) {
return target.hasOwnProperty(prefix + name);
},
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment