【问题标题】:Javascript - add same properties with different valuesJavascript - 添加具有不同值的相同属性
【发布时间】:2013-12-14 19:53:39
【问题描述】:

重要:代码有效,所以这更像是“这是正确的方法吗?”问题。

我试图在函数中向我的对象属性添加不同的值,然后将其推送到数组中。 对象属性应保持不变,但名称应更改。

输出:

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)
}

对不起,如果这可能有点混乱

【问题讨论】:

  • 为什么你认为这是一个好方法?你的方法的哪一部分让你感到不安?
  • 我不知道这是不是一个好方法。我想知道是否真的有必要每次都创建一个新对象,也许也可以在 for 循环或类似的东西中做到这一点?
  • 这取决于您对这些对象所做的其他操作。如果ClientObj 实例没有方法,则不需要构造函数。
  • 不,它没有任何方法,它只是我的值的容器,这就是为什么我想知道我是否应该在这里使用构造函数
  • 看起来 clientList 会有几个 ClientInfo 实例,所以你可以坚持使用构造函数。这是验证其存储的数据的好地方。如果您在 myFunc 之外定义 ClientInfo 并对其进行更改,则 clientList 中的所有实例都将更改,您希望每次调用 myFunc 时 ClientInfo 都是唯一的,然后在 myFunc 中将 ClientInfo 声明为对象文字。

标签: javascript oop object


【解决方案1】:

只是一些小事。您的 that 变量目前没用。当您需要在 Ajax 回调中保留对对象的引用时,通常会使用类似的方法。

  • clientObj 应该大写,因为它是一个构造函数。

  • 考虑将 clientObj 设为函数声明,以便提升它,这对您来说可能重要也可能不重要。

所以可能是这样的

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

另外,这是无效的:

function myFunc(socket.id, userName){

我认为你的意思是这样的:

function myFunc(socketId, userName){

【讨论】:

  • 嗨 Adams,感谢您的提示,所以没有办法通过某种 for 循环来实现这一点?
  • @ChristophHa - 当然可以。您当然可以创建对象并将它们推送到循环中的数组
  • @Christoph:我可能遗漏了一些东西,但您能否(在您的问题中)清楚、准确地解释您想要做什么?您宁愿更改代码以做得“更好”或不同,这有什么问题、效率低下或有问题?
【解决方案2】:

如果我没听错的话。您想使用一些具有相同值但属性名称不同的外部对象并将其推送到数组中。在这种情况下,我会写如下内容:

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();

我不确定这是否是您正在寻找的东西,但有一些事情需要考虑。遍历自定义类型并不得不调用构造函数听起来不再那么糟糕了。


更新:


只是为了好玩,我决定做这个小提琴来玩:http://jsfiddle.net/Y3eA5/

【讨论】:

    猜你喜欢
    • 2018-01-20
    • 2020-02-22
    • 2016-01-04
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多