2013-12-24 28 views
-1

我是一名經驗豐富的軟件開發人員,並且掌握了大量的語言。我的愛強烈類型的語言,如C++/C#。對於JS,我只知道一些事情,對最佳實踐沒有很好的理解。javascript:字段vs獲取方法

現在,我正在實施幾項功能,並開始使用JavaScript中的「類」開始教育目的。我的一個類看起來如下:

function Position(id, name, posX, posY) { 
    this._id = id; 
    this._name = name; 
    this._poxX = posX; 
    this._posY = posY; 
} 
var positions = [ 
    new Position(0, " ", 0, 190), 
    new Position(1, "GK", 68, 170), 
    new Position(2, "LB", 25, 155), 
    new Position(3, "SW", 68, 150), 
    new Position(4, "RB", 111, 155), 
    ... 
]; 

我打算使用對象的方式是以下幾點:

for (var j = 0; j < positions.length; j++) { 
     var posJ = positions[j]; 
     posControl.append(new Option(posJ._name, posJ._id)); 
    } 

對我來說,JS是知道很多「黑客」(如分配方法)和我絕不會在C++或C#中編寫類似的東西,但在JS中...

問題:我應該爲「_name」和「_id」或JS中的字段創建getter嗎?可以讓它們公開訪問並按我的計劃使用?

任何有關JS代碼風格的建議都非常受歡迎!

非常感謝您的反饋!

P.S.在獲得了一些經驗後,我想出了正確的方法:

function Position(id, name, posX, posY) { 
    var _id = id; 
    var _name = name; 
    var _poxX = posX; 
    var _posY = posY; 

    this.getId = function() { return _id; }; 
    this.getName = function() { return _name; }; 
} 

這種方式不僅提供getters/setters,它也使變量私人。

我會把這個寫入「答案」,但問題被擱置。

P.P.S.大概問題應該改成「如何讓班級成員私人化」,但是在撰寫問題的那一刻我確信這在JS中是不可能的:)

+0

爲了簡化代碼,請將它們保留爲公共屬性。但是getters/setter給你更多的靈活性,因爲你可以在將值傳遞給調用者之前進行處理。這是你的電話。 – Joseph

+0

您是唯一可以決定是否可以公開訪問數據的人。有些人喜歡用「或」兩個下劃線前綴「放手」屬性名稱。 –

+2

可能更適合codereview.se(如果他們想要的話)。 –

回答

1

恐怕你可能會被卡住古典繼承的土地,當你應該思考原型。

我想迅速打消JavaScript解決方案的概念,因爲您稱之爲「黑客」。我並不試圖迂腐,只是當你將可接受的解決方案視爲妥協時,你永遠不會完全理解爲什麼它首先被選中。

總之,你的代碼似乎很好。 Getters和setter只有對類/對象的私有成員纔有意義,您可以使用閉包來實現JavaScript。如果你確定._name和._id可以被其他變量訪問,那麼你的代碼看起來很好。

但是,如果你想實現的東西,允許只讀到您的._name屬性訪問,那麼你會寫......

function Position(name) { 
    this.getName = function() { 
    return name; 
    }; 
} 

pos = new Position('harry'); 
if (pos.getName() == 'harry') { 
    console.log('Private member access!'); // will print 
} 

這是你的選擇,你如何去實現這一點,是依賴在你的代碼的目的。希望以上給了你一些關於如何構建你的類的想法,但是要研究原型繼承和閉包,它們在正確使用時非常強大。