namespace
Provides an API for creating namespaces for any given objects, which effectively may be used for creating fields that are not part of objects public API.
| 1 2 3 4 | let { ns } = require('api-utils/namespace');let aNamespace = ns();aNamespace(publicAPI).secret = secret; | 
One namespace may be used with multiple objects:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | let { ns } = require('api-utils/namespace');let dom = ns();functionView(element) {  let view = Object.create(View.prototype);  dom(view).element = element;  // ....}View.prototype.destroy = functiondestroy() {  let { element } = dom(this);  element.parentNode.removeChild(element);  // ...};// ...exports.View = View;// ... | 
Also, multiple namespaces can be used with one object:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | // ./widget.jslet { Cu } = require('chrome');let { ns } = require('api-utils/namespace');let { View } = require('./view');// Note this is completely independent from View's internal Namespace object.let sandboxes = ns();functionWidget(options) {  let { element, contentScript } = options;  let widget = Object.create(Widget.prototype);  View.call(widget, options.element);  sandboxes(widget).sandbox = Cu.Sandbox(element.ownerDocument.defaultView);  // ...}Widget.prototype = Object.create(View.prototype);Widget.prototype.postMessage = functionpostMessage(message) {  let { sandbox } = sandboxes(this);  sandbox.postMessage(JSON.stringify(JSON.parse(message)));  ...};Widget.prototype.destroy = functiondestroy() {  View.prototype.destroy.call(this);  // ...  deletesandboxes(this).sandbox;};exports.Widget = Widget; | 
In addition access to the namespace can be shared with other code by just handing them a namespace accessor function.
| 1 2 3 4 | let { dom } = require('./view');Widget.prototype.setInnerHTML = functionsetInnerHTML(html) {  dom(this).element.innerHTML = String(html);}; | 
