2011-11-27 105 views
0

我有一个问题需要解决,关于我的Javascript代码。在实例化对象时(在这种情况下添加新成员)我希望成员获得唯一的ID。以下是我的代码的简化版本,可以为您提供我想要的图片。做这个的最好方式是什么?实例化对象(带构造函数)时设置唯一标识

function Member(name){ 

    //unique id code... 

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

    this.setName = function(_name){ 
     name = _name; 
    } 
} 

回答

2

我想它很容易为:

(function() { 
    var idcounter = 0; 

    function Member(name){ 
     this.id = idcounter++; 
     this.getName = function(){ 
      return lastName; 
     }; 

     this.setName = function(_name){ 
      name = _name; 
     }; 
    } 

    yournamespace.Member = Member; 
}()); 

yournamespace应该是你的应用程序对象或什么的。您也可以在浏览器中将其替换为window,以使Member构造函数成为全局。

+0

顺便说一下,在退出匿名函数之前,您应该将成员导出到全局,但OP可能没有意识到它。 – Esailija

+0

+1。 @Esailija:我认为这绝对是一个重点。 – flesk

+0

伟大的解决方案。但是,我真的没有得到命名空间的东西? – holyredbeard

0

如果你只是想要一个(可能)唯一的ID,你可以使用

var id = new Date().getTime(); 

返回纪元以来(1970年1月1日)毫秒。

编辑:我想我从来没有遇到过下面评论中描述的JavaScript应用程序中描述的极端情况,但在这些情况下,这肯定是一个不好的解决方案。

+0

并依靠慢速计算机来获得唯一ID? – Esailija

+0

@Esailija如果他可能每秒创建数千个对象,那可能不是一个好主意。我自己从来没有遇到过这种方法的问题,并且当我喜欢避免计数器的全局变量时。 – flesk

+0

为什么你认为全局变量是唯一的其他选择?尤其是当jAndy的回答在你的鼻子下:P – Esailija

0

使用立即调用的函数表达式(IIFE)为函数创建一个作用域。在这个范围内你定义一个计数器变量。只要uniqueId存在,此范围在整个运行时间内保留。只有返回的函数才能访问范围。每次调用uniqueId函数时,它都会向作用域中的计数器添加+1并返回该值。

var uniqueId = (() => { 
     var counter = 0 

     return function() { 
      return counter++ 
     } 
    })() 

console.log(uniqueId()) 
console.log(uniqueId()) 
console.log(uniqueId()) 

提示:lodash也有一个uniqueId函数。

相关问题