在我的公司環境中,我們使用了大量的javascript。爲了簡化所有這些腳本的管理,避免命名衝突,我們通過對命名空間的一個javascript的命名規則,這基本上是:當名稱空間已經存在時,Type.registerNamespace引發錯誤
CompanyName.ProjectName.Area.XYZ.js
要創建命名空間,我們使用的是以下模式:
var Company;
(function (Company) {
(function (Project) {
(function (Area) {
(function (XYZ) {
function function1(args) {
},
function function2(args) {
}
})(Area.XYZ|| (Area.XYZ = {}));
})(Project.Area || (Project.Area = {}));
var Area = Project.Area;
})(Company.Project || (Company.Project = {}));
var Project = Company.Project;
})(Company || (Company = {}));
哪些工作正常(實際上,這是TypeScript腳本的輸出)。
但是,我也有一些使用Microsoft Ajax命名空間函數的腳本,因爲這是失控應用程序(JavaScript插件)所要求的。
我使用此聲明:
Type.registerNamespace('CompanyName.ProjectName.Area');
CompanyName.ProjectName.Area.ABC = function() {
}
CompanyName.ProjectName.Area.ABC.prototype = {
function1 : function (args) {
},
function2 : function (args) {
}
}
但調用Type.registerNamespace
拋出一個錯誤:
Sys.InvalidOperationException: Object Company already exists and is not a namespace
我怎樣才能正確地結合兩者的優點?我如何解決我的問題並使警告消失?
我無法控制腳本包含的順序,因爲它是由應用程序動態生成的。
我不想將整個代碼遷移到微軟的模式,因爲它很無用而且很難閱讀。而當我遷移到打字稿時,我甚至無法控制命名空間輸出。
我也不想引入另一個命名空間來排除Ajax的,因爲它會給所有的團隊帶來一些困惑。
如果您有興趣,我寫了一個名爲def-once的函數。它所做的是檢查命名空間的每個部分是否被註冊,並繼續下去直到完成;然而,這個語法有點但很有趣。 https://github.com/furiousscissors/OF.Core.js/blob/master/js/of/defonce.js - defOnce('CompanyName.ProjectName.Area',function(){function YourFn(){} return YourFn;},window); –
@TravisSharp:這聽起來很有趣,但我堅持使用Microsoft Ajax的風格(因爲託管應用程序 - 要命名的SharePoint--需要此名稱空間模型)並且還堅持使用TypeScript輸出約定。 thx對於暗示 –