2013-12-14 87 views
1

重要提示:代碼有效,所以這更像是「這是正確的方式嗎?」題。Javascript - 使用不同的值添加相同的屬性

我試圖給函數中的對象屬性添加不同的值,然後將其推送到一個數組。 對象屬性應該保持不變,但名稱應該改變。

輸出:

Object { 
    clientId="cXbHV32Sz0gh-10Mo6DX", 
    userName="Foo" 
}, 
Object { 
    clientId="J3ZkTsK6ixTM6pUBo6DY", 
    userName="bar" 

我只能用這種解決方案來實現它:

var clientObj = function (clientId, userName){ 
    var that = this; 
    this.clientId = clientId; 
    this.user 
} 

function myFunc(socket.id, userName){ 
    var clientInfo = new clientObj(socket.id, userName) 
    clientList.push(clientInfo) 
} 

我不知道如果我真的需要在這裏有一個構造函數,它確實沒有什麼比拯救我的屬性。

那麼我怎樣才能不使用構造函數呢?

我認爲是這樣的(但這隻能更換值):

如果
var ClientObj = {} 

function myFunc(socketId, userName){ 
    ClientObj['socketID'] = socketID 
    ClientObj['userName'] = userName 
    clientList.push(clientObj) 
} 

對不起,這可能是一個有點混亂

+0

爲什麼你認爲這是做一個好辦法它?你的方法的哪一部分會讓你感到不安? –

+0

我不知道這是否是一個好辦法。 我想知道是否真的有必要每次創建一個新的對象,也許這也可以在for循環或類似的東西中做到這一點? – xhallix

+1

那麼這取決於你正在用這些對象做什麼。如果'ClientObj'實例沒有方法,那麼你不需要構造函數。 –

回答

1

只是一些小事情。您的that變量目前無用。當你需要在Ajax回調中保留對象的引用時,通常會使用類似的東西。

  • clientObj應該大寫,因爲它是一個構造函數。

  • 考慮讓clientObj成爲函數聲明,這樣它就會被掛起,這對你來說可能並不重要。

因此,也許這樣的事情

function ClientObj(clientId, userName){ 
    this.clientId = clientId; 
    this.user = userName; 
} 

此外,這是無效的:

function myFunc(socket.id, userName){ 

我認爲你的意思是這樣的:

function myFunc(socketId, userName){ 
+0

嗨亞當斯, 感謝您的提示,所以沒有辦法用某種for循環來實現這一點? – xhallix

+0

@ChristophHa - 當然你可以。你當然可以創建對象並將它們推送到一個循環中的數組中 –

+0

@Christoph:我可能錯過了一些東西,但是你可以(在你的問題中)清楚地解釋,確切地說,你想要做什麼?什麼是錯誤的,效率低下或有問題的代碼,你想改變做更好或不同? –

1

如果我理解你的權利。您想要使用具有相同值但屬性名稱不同的某個外部對象並將其推送到數組。在這種情況下,我寫的東西,如:

function Client(obj) { 
    this.clientId = obj.clientId; 
    this.user = obj.userName; 
    return this; 
} 

Client.prototype.pushTo = function(arr) { 
    arr.push(this); 
    return this; 
}; 

var clientList = []; 

然後,當我收到的對象:

var externalObj = { clientId: 'blah', userName: 'name' }; 

我可以打電話:

var convertedClient = new Client(externalObj).pushTo(clientList); 

你會得到它的轉換,推送到數組並將其分配給全部使用同一個班輪的局部變量。另外,如果您稍後想要使用相同類型執行新操作,則可以添加它們。

Client.prototype.clearName = function(){ 
    this.name = ''; 
    return this; 
}; 

如果你繼續從你的原型中返回這個,你可以一個接一個地鏈接很多命令。

var processedClient = new Client(obj).pushTo(arr).clearName(); 

我不確定這是你要找的東西,但有些事情需要考慮。通過一個自定義類型並且不得不調用一個構造函數聽起來不再那麼糟糕。


UPDATE:


只是出於好玩的,我決定做這個撥弄玩:http://jsfiddle.net/Y3eA5/

相關問題