2014-02-27 25 views
4

我要創造我自己的命名空間的自定義命名空間或類,像$JQuery的如何創建在JavaScript

(function(app) { 
    app.fn.log = function(data) { 
      console.log(data); 
     }; 
}(app)); 

app.log("data"); 

但這代碼返回一個錯誤 - 未捕獲的ReferenceError:應用未定義

如何創建我自己的名稱空間?

+0

那麼,應用程序的定義?該函數採用'app'參數,並傳遞一個不存在的'app'變量... – elclanrs

+0

我不知道如何以及應該在哪裏植入 – Ata

+0

看看這是否有幫助http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript – elclanrs

回答

2
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未被定義的時間匿名函數執行。

+0

謝謝,是的,它現在運行良好,但我希望你知道我的另一個問題,你可以看到console.log(數據);顯示該函數調用的瀏覽器中的行,是否有任何方式可以顯示被函數調用的行?我的意思是顯示線,我稱之爲app.log('數據'); – Ata

+0

什麼意思是'line'?電話號碼? –

+0

是的,頁碼 – Ata

1

您的語法沒問題,但您必須定義一個app。您將應用作爲參數傳遞到IIFE,但應用未定義!如果你想訪問的jQuery的應用程序,只需撥打您IIFE與jQuery對象是這樣的:

(function(app) { 
    app.fn.log = function(data) { 
      console.log(data); 
     }; 
}($)); // where $ is your jQuery. 

$.log("data"); 

當心!日誌功能將在IIFE範圍之內和之外提供!

3

在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對象內。
  • 它爲您提供了一種替代選項來附加東西到窗口對象(有些人覺得這很討厭)。
+0

不錯的答案了 – Ata