先日やたらレガシーな案件で、スポットのお手伝いとしてJSを書きました。
その時constの代わりが欲しくなって変わりの処理を書いたので一応メモ書き。
/** GlobalRegistor CLASS */ (function () {
"use strict";
// constructor
function GlobalRegistor () {}
// static accessor
Object.defineProperty(GlobalRegistor, 'global', {
/**
* @return {Object} global object
*/
get: function() {
return new Function('return this')();
}
});
// static
Object.defineProperty(GlobalRegistor, 'readOnly', { writable: false,
/**
* @param {String} name
* @param {Any} value
* @return {Void}
*/
value: (function readOnly (name, value) {
if (GlobalRegistor.global[name] === void 0) {
Object.defineProperty(GlobalRegistor.global, name, { writable: false, value: value });
} else {
throw new Error(name + ' is Declare Property');
}
})
});
GlobalRegistor.readOnly('GlobalRegistor', GlobalRegistor);
})();
使い方
.js
GlobalRegistor.readOnly('globalModules', {});
window.globalModules.fn = function () { console.log('success!'); };
window.globalModules = null;
window.globalModules.fn(); // success!
widnow.globalModules.foo = 1;
widnow.globalModules.foo = 2;
console.log(widnow.globalModules.foo); // 2
GlobalRegistor.readOnly('foo', 1);
console.log(widnow.foo); // 1
widnow.foo = 999;
console.log(widnow.foo); // 1
GlobalRegistor.readOnly('foo', 999); // error