2015-09-18 63 views
0

現在我有以下的靜態類在我的應用程序:靜態類的對象字面

function Tools() { } 
Tools.someFunction = function(arg1, arg2) { 
    // do something 
}; 

但我改變了我的js文件的架構,一個對象包含所有類的文字,所以我需要這樣的東西:

var app = { 
    someController: function() { 

    }; 
    tools: function() ... 
}; 

其實我有兩個問題: - 這是JavaScript的一個很好的架構來包裝在一個大的對象中的所有代碼? - 我該如何將這個靜態類附加到這個文字上?

+0

兩者都很好,但我認爲第二個更好,因爲在它裏面我們也可以有私有函數和變量。但都很好 –

+0

第一個也可以有私人功能.. – Rayon

+0

旁註:OOP沒有「靜態類」的概念。有靜態_members_(方法或屬性),而不是_classes_。雖然只包含靜態成員的類可能被稱爲靜態,但這只是一個縮短的術語,而不是單獨的概念。 – hindmost

回答

1

首先,解僱詞並使用原型。 ECMA-Script 6及以上版本正在引入基於類的面向對象編程,但您的代碼似乎正在使用基於原型的繼承系統。那麼,事實上,你只是使用的構造函數來創建對象。

使用正確的術語是與社區溝通的良好開端。其次,在JavaScript中沒有靜態類。函數在JavaScript中是必不可少的,它們仍然是對象。與對象類似,函數是可擴展的,您可以添加屬性,除非您在其上調用Object.preventExtensions

這只是你的構造函數也有一個屬性持有一個函數。

如果你要認爲構造函數爲您app對象的一部分,將其添加爲一個普通的屬性:

var app = { 
    Tools: function() {} 
}; 

app.Tools.someFunction = function() { 

}; 

這是JavaScript的一個很好的架構來包裝所有的代碼在一個大 目的?

當然。但使用模塊模式。網上有大量關於這個話題的文章。您可能需要查看其他Q & A:why module pattern?

+0

「你的代碼仍在使用基於原型的繼承系統」 - 我在想它在哪裏。否則,這是我會推薦的答案。 :) – Pavlo

+0

@Pavlo哈哈,這就是爲什麼我添加了部分**呃,實際上,你只是使用構造函數創建對象。** ... –

+1

@Pavlo檢查我的編輯......我'D'改寫了句子:D –

0

這是一個很好的架構來將所有代碼封裝在一個大對象中嗎?

不是真的在這個時代。當然,這種方法可以將全局名稱空間上的腳印縮小爲單個名稱,如app。但使用ES6模塊可以更輕鬆地完成相同的任務。轉移非常容易。你可以繼續寫

function Tools() { } 
Tools.someFunction = function(arg1, arg2) { 
    // do something 
}; 

因爲你之前,但增加

export default Tools; 

然後,您要使用此

import Tools from 'tools'; 
Tools.somefunction(); 

我怎麼可以追加靜態類這個字面意思?

有了ES6模塊,您不需要,但在這裏的許多問題中描述了許多模式。一些例子:

IIFE:

var app = { 
    someController: function() { 
    var f = function() { }; 
    f.someProp = 42; 
    return 42; 
    }(), 

初始化程序:

var app = { 
    someController: function() { }, 
    init: function() { 
    this.someController.someProp = 42; 
    return this; 
    } 
}.init(); 

明確劃分:

var app = { 
    someController: function() { } 
}; 
app.someController.someProp = 42; 

這些都不是很好玩的讀取或寫入。他們對2012年的感覺有些類似。使用ES6模塊來避免這種情況,並回到編寫常規舊代碼。