我要創造我自己的命名空間的自定義命名空間或類,像$爲JQuery的如何創建在JavaScript
(function(app) {
app.fn.log = function(data) {
console.log(data);
};
}(app));
app.log("data");
但這代碼返回一個錯誤 - 未捕獲的ReferenceError:應用未定義
如何創建我自己的名稱空間?
我要創造我自己的命名空間的自定義命名空間或類,像$爲JQuery的如何創建在JavaScript
(function(app) {
app.fn.log = function(data) {
console.log(data);
};
}(app));
app.log("data");
但這代碼返回一個錯誤 - 未捕獲的ReferenceError:應用未定義
如何創建我自己的名稱空間?
window.app = {};
(function(app) {
app.log = function(data) {
console.log(data);
};
}(app));
app.log("data");
jQuery的處理與它不同的一點是fn
:當您使用$('selector')
語法找到的元素,你需要處理的jQuery返回spetial 包裝包含所有你除了內置作出fn.func
式的定義在功能。
所以如果你需要實現某種擴展性,你應該首先考慮這種包裝。例如:
window.app = function(p) {
// do whatever you need
var wrapper = {
// standard common fields
};
if (app.fn) {
// extend wrapper with app.fn
}
return wrapper;
};
順便問一下你想解決什麼問題?
在你的情況下,當然有一個例外,因爲app
未被定義的時間匿名函數執行。
您的語法沒問題,但您必須定義一個app
。您將應用作爲參數傳遞到IIFE,但應用未定義!如果你想訪問的jQuery的應用程序,只需撥打您IIFE與jQuery對象是這樣的:
(function(app) {
app.fn.log = function(data) {
console.log(data);
};
}($)); // where $ is your jQuery.
和
$.log("data");
當心!日誌功能將在IIFE範圍之內和之外提供!
在JavaScript中實現命名空間的常用方法是利用帶有立即函數的module pattern進行範圍設定(就像你在你的問題中演示的那樣)。這也可以讓你在不衝突的名稱的對象傳遞,並使用它們使用參數的名稱,你會更喜歡如$
像這樣:
//Global script declaration
var NAMESPACE = {};
//Check if you need to initialize your namespace
NAMESPACE.FooSpace = NAMESPACE.FooSpace || {};
//Some other script
NAMESPACE.FooSpace = (function($) {
function Foo1() {
}
function Foo2() {
return $.getSomething(); //some existing function inside of someObjectWithANonConflictingName object
}
return { Foo1: Foo1, Foo2: Foo2 };
})(someObjectWithANonConflictingName);
//somewhere else in code (call as a constructor function)
var foo = new NAMESPACE.FooSpace.Foo1();
//somewhere else in code (call as regular function)
var foo2 = Foo2();
NAMESPACE
對象,以便具有重疊的函數和變量名稱。NAMESPACE
對象內。不錯的答案了 – Ata
那麼,應用程序的定義?該函數採用'app'參數,並傳遞一個不存在的'app'變量... – elclanrs
我不知道如何以及應該在哪裏植入 – Ata
看看這是否有幫助http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript – elclanrs