2013-12-14 43 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/

相关问题