簡體   English   中英

如何在javascript中創建自定義命名空間或類

[英]How do I create a custom namespace or class in javascript

我想創建自己的命名空間,比如$ for JQuery

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

 app.log("data");

但是此代碼返回錯誤 - 未捕獲的ReferenceError:app未定義

如何創建自己的命名空間?

在javascript中實現命名空間的一種常用方法是利用具有直接函數的模塊模式進行范圍界定(就像您在問題中演示的那樣)。 這也允許您傳入具有非沖突名稱的對象,並將它們與您喜歡的參數化名稱一起使用,例如$ like so:

//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對象中。
  • 它為您提供了另一種選擇,可以將某些東西附加到窗口對象上(有些人覺得這很令人反感)。
window.app = {};

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

app.log("data");

jQuery與它的fn略有不同:因為你使用$('selector')語法來查找你需要處理的元素jQuery返回包含除了內置fn.func之外你所做的所有fn.func類定義的spetial 包裝器功能。

因此,如果您需要實現某種可擴展性,您應首先考慮這種包裝。 例如:

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 ,但未定義應用程序! 如果你想以app身份訪問jQuery,只需使用jQuery對象調用你的IIFE:

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

$.log("data");

謹防! 日志功能將在IIFE范圍內外使用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM