你可以做類似如下:
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));
但使用比這裏的功能以外的任何其他的提防。如果你這樣做,並嘗試調整全局/窗口命名空間的參數,它們將不會被帶回到你的庫函數中,並且可能不會得到你想要的行爲。例如:
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!
它沒有這個限制將是你的庫構造函數適用於全球/ window對象的選擇:
Library.call(this);
與麻煩的是,你不」不要用你的公共API來污染全局範圍,而是用你在本地關閉時可能存儲的任何東西來污染全局範圍。這讓我感到沉重。
如果你的庫使用類似揭示模塊模式的東西,並只公開功能,那麼我認爲第一個非常簡單。但正如其他人所說,這可能並不明智。在最多的情況下,我會提供這個作爲用戶的選擇,但警告它。
瀏覽器或Node.js?另外,不要這樣做。 – SLaks
這可能並不難。你的代碼結構如何? –
瀏覽器。我有一個'函數庫(){this.var = 5; this.otherVar = 4; this.cool = function(){}} var library = new Library();'。 然後我調用像這樣的函數和變量:'library.cool();'。 –