次のようなことができます。
function Library() {
this.var = 5;
this.otherVar = 4;
this.cool = function(x) {
return x + this.otherVar;
}
}
var library = new Library();
(function (lib, context) {
for (var prop in lib) {
if (lib.hasOwnProperty(prop) && prop) {
if (typeof lib[prop] == "function") {
context[prop] = function() {
return lib[prop].apply(lib, arguments);
}
} else {
context[prop] = lib[prop];
}
}
}
}(library, this));
ただし、ここで関数以外を使用する場合は注意してください。これを行って、global/window 名前空間のパラメーターを調整しようとすると、パラメーターがライブラリ関数に戻されず、必要な動作が得られない可能性があります。例えば:
library.cool(3); // 7
cool(3); // 7
otherVar = 10;
library.cool(3); // 7
cool(3); // 7 Still?
library.otherVar = 10;
library.cool(3); // 13
cool(3); // 13 Finally!
この制限がない代替手段は、ライブラリ コンストラクター関数をグローバル/ウィンドウ オブジェクトに適用することです。
Library.call(this);
これに関する問題は、パブリック API でグローバル スコープを汚染するだけでなく、途中でローカル クロージャに格納した可能性のあるものも汚染することです。それは私には重すぎるように思えます。
あなたのライブラリが公開モジュール パターンのようなものを使用し、関数のみを公開している場合、最初のパターンは非常に簡単だと思います。しかし、他の人が言ったように、それは賢明ではないかもしれません。せいぜい、これをユーザーのオプションとして提供しますが、それに対して警告します.