2013-04-04 52 views
0

在JavaScript中,我想將對象A標記爲特殊的,以便當A訪問B時,B可以檢查A是否被標記,以便B將A視爲與其他對象不同。 (認爲​​B是用於處理許多不同的對象串行化器,以及A具有以某種方式被序列化。)使用屬性或方法將某個類標記爲特殊類? (在JavaScript中)

現在,我既可以 1:在一組屬性,例如,A.special =真
2:定義一個方法,例如A.isSpecial(),如果該方法存在,則表明A是特殊的。

我知道這兩個都做同樣的事情。從設計角度來看,有沒有什麼不同,這使得一個更好?

+3

如果您要做的只是查找屬性/方法的存在,請使用屬性。如果你想/需要做某些特定的事情來確定它(例如實際運行的代碼......也許計算對象的長度以確定它是否特殊),並檢查其結果,請使用方法。使用沒有目的和「空洞」的方法只是誤導。 – Ian 2013-04-04 14:32:40

+0

取決於情況,但可能您可以直接測試A(A之所以如此特殊)之間的差異,而無需設置其他屬性。 – eminor 2013-04-04 15:03:16

+0

如果你使用一個屬性,我會選擇一個更有意義的名稱,而不是稱它爲「特殊」。 – eminor 2013-04-04 15:13:14

回答

1

從設計的角度來看,有沒有什麼區別,哪一個更好?

該布爾屬性更簡單,更容易測試。如果沒有定義,A.special將導致undefined這是已經是虛假的。

如果您使用某種方法,則需要測試typeof A.special == "function" && A.special(),因爲如果方法未定義,只有A.special()會導致異常。

如果您需要動態計算特殊性(可能取決於其他屬性?),並且不希望隨時更新布爾標誌並更新這些屬性,那麼方法解決方案才更可取。但是,對於這種情況,也有使用getter屬性的中間方法(如果您不需要支持舊的IE)。

-1

使用屬性A.special = true;會更快(雖然我懷疑這是一個性能關鍵的代碼段)。

做一個方法A.special = function() {...};的好處是,你得到一個間接層,可以把更多的高級邏輯在那裏。例如,

A.special = function() { return foo && bar && !baz ? true : false; }; 
+0

爲什麼downvote? – jmar777 2013-04-04 14:48:53

0

訪問屬性是絕對速度快:

this.special = true; 

但外面A的代碼,有人能做到A.special = false。沒有辦法阻止這種情況。

使用方法禁止其他對象修改該值。在A的構造可以定義:

... 
var special = true; 
... 
this.isSpecial = function() {return special;}; 

在現代瀏覽器中,有一種方式來獲得最好的兩個:Object.defineProperty。所以,你可以定義屬性和禁止外部資源來改變它:

Object.defineProperty(this, "special", {value: true, writable: false, configurable: false}); 

這不是在IE7提供和更低,在IE8僅被定義爲DOM對象和使用getset屬性定義:

Object.defineProperty(this, "special", {get: function() {return true;}}); 

這並不比調用isSpecial方法快。

+0

「*禁止外部來源改變它*」 - 不僅僅是*外部*,它會阻止*任何*嘗試改變它。 – Bergi 2013-04-04 14:40:17

+0

@Bergi那包括外部來源:D但無論如何,人們可以期望你知道你在用你的代碼做什麼。 – MaxArt 2013-04-04 14:41:29

+0

順便說一句,你可以通過覆蓋它來修改函數返回值('A.special = function(){return false;};') – Bergi 2013-04-04 14:42:31

相關問題