2011-11-27 35 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函數。

相關問題