国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【譯】JavaScript 中的命名空間

Crazy_Coder / 1297人閱讀

摘要:原文鏈接譯文原鏈譯中的命名空間全局變量應該由有系統范圍相關性的對象們保留,并且它們的命名應該避免含糊并盡量減少命名沖突的風險。其他的考慮我希望避免命名空間嵌套。因為并沒有正式的命名空間結構,所以有很多自然形成的方法。

原文鏈接: Namespacing in JavaScript
譯文原鏈: 【譯】JavaScript 中的命名空間

全局變量應該由有系統范圍相關性的對象們保留,并且它們的命名應該避免含糊并盡量減少命名沖突的風險。在實踐中,這意味著你應該避免創建全局對象,除非它們是絕對必須的。

不過,恩,這些你早都知道了……

所以你對此是怎么做的?傳統方法告訴我們,最好的消除全局策略是創建少數作為潛在模塊和子系統的實際命名空間的全局對象。我將探索幾種有關命名空間的方式,并以我基于 James Edwards 最近的一篇文章得到的一個優雅、安全和靈活的解決方案結束。

靜態命名空間

我用靜態命名空間作為那些命名空間標簽實際上硬編碼的解決方案的涵蓋性術語。是的,你可以將一個命名空間重新分配給另一個,不過新的命名空間將會引用和舊的那一個同樣的對象。

1.通過直接分配

最基礎的方法。這樣非常冗長,并且如果你還想重命名這些命名空間,你就有得活兒干了。不過它是安全和清楚明白的。

var myApp = {}
myApp.id = 0;
myApp.next = function() {
    return myApp.id++;  
}
myApp.reset = function() {
    myApp.id = 0;   
}
window.console && console.log(
    myApp.next(),
    myApp.next(),
    myApp.reset(),
    myApp.next()
); //0, 1, undefined, 0 

你也可以通過使用this引用兄弟屬性來使將來的維護更輕松一些,不過這有一點冒險因為沒有什么能阻止你的那些命名空間里的方法被重新分配。

var myApp = {}
myApp.id = 0;
myApp.next = function() {
    return this.id++;   
}
myApp.reset = function() {
    this.id = 0;    
}
myApp.next(); //0
myApp.next(); //1
var getNextId = myApp.next;
getNextId(); //NaN whoops!
2.使用對象字面量

現在我們只需要引用命名空間名一次,因此之后改變名字更簡單了一些(假設你還沒反復引用這個命名空間)。仍有一個危險是this的值可能會拋出一個『驚喜』 - 不過假設在一個對象字面結構里定義的對象不會被重新分配相對安全一點。

var myApp = {
    id: 0,
    next: function() {
        return this.id++;   
    },
    reset: function() {
        this.id = 0;    
    }
}
window.console && console.log(
    myApp.next(),
    myApp.next(),
    myApp.reset(),
    myApp.next()
) //0, 1, undefined, 0
3.模塊模式

我發現自己最近用模塊模式更多。邏輯被一個方法包裝從全局域隔離開了(通常是自調用的),它返回一個代表這個模塊公開接口的對象。通過立即調用這個方法并分配結果給一個命名空間變量,我們就鎖住了這個命名變量中模塊的 API。此外,任何沒有包括在返回值中的變量將永遠保持私有,只對引用他們的公開方法可見。

var myApp = (function() {
    var id= 0;
    return {
        next: function() {
            return id++;    
        },
        reset: function() {
            id = 0;     
        }
    };  
})();   
window.console && console.log(
    myApp.next(),
    myApp.next(),
    myApp.reset(),
    myApp.next()
) //0, 1, undefined, 0  

如上對象字面量例子,命名空間名字可以輕易更換,不過還有額外優勢:對象字面量是四班的 - 它全是關于屬性分配,沒有支持邏輯的空間。此外,所有屬性必須被初始化,并且屬性值無法輕易跨對象引用(因此,比如,內部閉包就不可能使用了)。模塊模式沒有任何上述約束,并且給我們額外的隱私福利。

動態命名空間

我們也可以將這一節稱為命名空間注入。命名空間由一個直接引用方法包裝內部的代理代表 - 這意味著我們不再需要打包分配給命名空間的返回值。這讓命名空間定義變得更靈活并且讓擁有多個存在于獨立命名空間中(或者甚至在全局上下文中)的模塊的獨立實例。動態命名空間支持模塊模式的全部特征并附加直觀和可讀性強的優勢。

4.提供命名空間參數

在這里我們只是將命名空間作為參數傳給自調用方法。變量id是私有的,因為他并沒有被分配給context。

var myApp = {};
(function(context) { 
    var id = 0;
    context.next = function() {
        return id++;    
    };
    context.reset = function() {
        id = 0;     
    }
})(myApp);  
window.console && console.log(
    myApp.next(),
    myApp.next(),
    myApp.reset(),
    myApp.next()
) //0, 1, undefined, 0  

我們甚至可以把context設置給全局對象(通過一個字的改變?。_@是庫主們的巨大財富 - 他們可以將他們的特性包裝在一個自調用函數中,然后讓用戶來決定它們是不是全局的(John Resig 在他寫 JQuery 時就是一個這個理論的早期采用者)。

var myApp = {};
(function(context) { 
    var id = 0;
    context.next = function() {
        return id++;    
    };
    context.reset = function() {
        id = 0;     
    }
})(this);   
window.console && console.log(
    next(),
    next(),
    reset(),
    next()
) //0, 1, undefined, 0  
5.用this作為命名空間代理

James Edwads 最近發布的一篇文章激起了我的興趣?!禡y Favorite JavaScript Design Patter》 顯然被很多評論者誤解了,他們認為他可能也是借助于模塊模式。這篇文章宣傳了多種技術(可能導致了讀者的迷惑),但是在它的核心部分是一點我已經修改并呈現為一個命名空間工具的很天才的東西。

這個模式的美就在于它僅僅是按照這個語言被設計的方式使用 - 不多不少、不投機也不取巧。此外因為命名空間是通過this關鍵字(它在給定的執行上下文中是不變的)注入的,它不可能被意外修改。

var myApp = {};
(function() {
    var id = 0;
 
    this.next = function() {
        return id++;    
    };
 
    this.reset = function() {
        id = 0;     
    }
}).apply(myApp);    
 
window.console && console.log(
    myApp.next(),
    myApp.next(),
    myApp.reset(),
    myApp.next()
); //0, 1, undefined, 0

更棒的是,apply(以及call) API 提供了與上下文和參數天然的隔離 - 因此給模塊創建者傳遞附加參數非常干凈。下面的例子表明了這一點,并且展示了如何獨立于多個命名空間來運行模塊。

var subsys1 = {}, subsys2 = {};
var nextIdMod = function(startId) {
    var id = startId || 0;
    this.next = function() {
        return id++;    
    };
    this.reset = function() {
        id = 0;     
    }
};
nextIdMod.call(subsys1);    
nextIdMod.call(subsys2,1000);   
window.console && console.log(
    subsys1.next(),
    subsys1.next(),
    subsys2.next(),
    subsys1.reset(),
    subsys2.next(),
    subsys1.next()
) //0, 1, 1000, undefined, 1001, 0

當然如果我們如果我們需要一個全局 id 生成器,非常簡單……

nextIdMod();    
window.console && console.log(
    next(),
    next(),
    reset(),
    next()
) //0, 1, undefined, 0

這個我們作為例子使用的 id 生成器工具并沒有表現出這個模式的全部潛力。通過包裹一整個庫和使用this關鍵字作為命名空間的替身,我們使得用戶在任何他們選擇的上下文中運行這個庫很輕松(包括全局上下文)。

//library code
var protoQueryMooJo = function() {  
    //everything
}
//user code
var thirdParty = {};
protoQueryMooJo.apply(thirdParty);
其他的考慮

我希望避免命名空間嵌套。它們很難追蹤(對人和電腦都是)并且它們會讓你的代碼因為一些亂七八糟的東西變得很多。如 Peter Michaux 指出的,深度嵌套的命名空間可能是那些視圖重新創建他們熟悉和熱愛的長包鏈的老派 Java 開發者的遺產。

通過 .js 文件來固定一個多帶帶的命名空間也是可以的(雖然只能通過命名空間注入或者直接分配每一個變量),不過你應該對依賴謹慎些。此外將命名空間綁定到文件上可以幫助讀者更輕易弄清整個代碼。

因為 JavaScript 并沒有正式的命名空間結構,所以有很多自然形成的方法。這個調查只詳細說明了其中的一部分,可能有更好的技術我沒有發現。我很樂意知道它們。

更多文章

James Edwards: My Favorite JavaScript Design Pattern
Peter Michaux: JavaScript Namespacing

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/79736.html

相關文章

  • JavaScript 命名空間

    摘要:前綴命名空間如果命名空間的目的是避免沖突的話。語言程序經常使用前綴命名空間。我認為前綴命名空間是中最清楚明白的命名空間系統。對象命名空間的一個問題是它會導致與面向對象消息傳遞混淆。嵌套命名空間的幻覺在中也存在。 原文鏈接:《JavaScript Namespacing》譯文原鏈:【譯】JavaScript 命名空間 JavaScript 中有很多可以給你的對象安全分配命名空間的方法。這...

    liujs 評論0 收藏0
  • [] 你想知道的關于 JavaScript 作用域的一切

    摘要:原文鏈接原文作者你想知道的關于作用域的一切譯中有許多章節是關于的但是對于初學者來說甚至是一些有經驗的開發者這些有關作用域的章節既不直接也不容易理解這篇文章的目的就是為了幫助那些想更深一步學習了解作用域的開發者尤其是當他們聽到一些關于作用域的 原文鏈接: Everything you wanted to know about JavaScript scope原文作者: Todd Mott...

    Flands 評論0 收藏0
  • 】《精通使用AngularJS開發Web App》(三)--- 深入scope,繼承結構,事件系

    摘要:比如,我們可以監聽事件由實例發出,然后在任何瀏覽器中就是變化的時候都會得到通知,如下所示每一個作用域對象都會有這個方法,可以用來注冊一個作用域事件的偵聽器。這個函數所扮演的偵聽器在被調用時會有一個對象作為第一個參數。 上一篇:【譯】《精通使用AngularJS開發Web App》(二) 下一篇:【譯】《精通使用AngularJS開發Web App》(四) 書名:Mastering W...

    wind5o 評論0 收藏0
  • React V16.9來了 無痛感升級 加入性能檢測 【-真香】

    摘要:更新日志應對添加以編程方式收集性能測量。在和在將棄用為常見攻擊面。添加對事件的支持。在從調用時發出警告,創建循環。在和從錯誤的渲染器使用時發出警告。 2019年8月8日,我們發布了React 16.9。它包含幾個新功能,錯誤修正和新的棄用警告,以幫助準備未來的主要版本。 showImg(https://segmentfault.com/img/bVbwoB5?w=1728&h=666)...

    zzir 評論0 收藏0
  • React V16.9來了 無痛感升級 加入性能檢測 【-真香】

    摘要:更新日志應對添加以編程方式收集性能測量。在和在將棄用為常見攻擊面。添加對事件的支持。在從調用時發出警告,創建循環。在和從錯誤的渲染器使用時發出警告。 2019年8月8日,我們發布了React 16.9。它包含幾個新功能,錯誤修正和新的棄用警告,以幫助準備未來的主要版本。 showImg(https://segmentfault.com/img/bVbwoB5?w=1728&h=666)...

    ky0ncheng 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<