2015-10-13 72 views
1

下面的代碼(也在Plunker中)適用於this SO post。 我試圖執行相同的邏輯,只需在Object.prototype的特殊屬性中添加uniqueId函數以保持清晰。通過在「名稱空間」中添加函數來擴展對象原型

下面的代碼在使用nodejs(也是HTML -ized Plunker示例也適用)運行時工作。即控制檯打印三個唯一的對象標識符:0,12

但是,當test開關變量設置爲1時,控制檯打印000

如何在foo名稱空間中添加uniqueId函數?

function addUniqueId1(){ 
    if (Object.prototype.foo===undefined) { 
     Object.prototype.foo = {}; 
     console.log('foo "namespace" added'); 
    } 
    if (Object.prototype.foo.uniqueId===undefined) { 
     var i = 0; 
     Object.prototype.foo.uniqueId = function() { 
      console.log('uniqueId function called'); 
      if (this.___uniqueId === undefined) { 
       this.___uniqueId = i++; 
      } 
      return this.___uniqueId; 
     }; 
     console.log('function defined'); 
    } 
} 


function addUniqueId2() { 
    if (Object.prototype.uniqueId === undefined) { 
     var i = 0; 
     Object.prototype.uniqueId = function() { 
      if (this.___uniqueId === undefined) { 
       this.___uniqueId = i++; 
      } 
      return this.___uniqueId; 
     }; 
    }; 
}; 


var test=2; // if you set this to 1 it stops working 

if (test==1) 
    addUniqueId1(); 
else 
    addUniqueId2(); 

var xs = [{}, {}, {}]; 
for (var i = 0 ; i < xs.length ; i++) { 
    if (test==1) 
     console.log('object id is: ['+xs[i].foo.uniqueId()+']'); 
    else 
     console.log('object id is: ['+xs[i].uniqueId()+']'); 
} 

回答

2

您需要定義foo吸氣劑,以允許它訪問this使用的子方法(一個或多個)的哈希內:

function defineFoo() { 
    if (Object.prototype.foo) return; 

    var i = 0; 

    Object.defineProperty(Object.prototype, 'foo', { 
    get: function() { 
     var self = this; 
     return { 
     uniqueId: function() { 
      return self.__uniqueId = self.uniqueId || ++i; 
     } 
     }; 
    } 
    }); 

} 

現在

defineFoo(); 
obj.foo.uniqueId() 

如果您願意,可以選擇使用self

Object.defineProperty(Object.prototype, 'foo', { 
    get: function() { 
    return { 
     uniqueId: function() { 
     return this.__uniqueId = this.uniqueId || ++i; 
     }.bind(this) 
    }; 
    } 
}); 
+0

這裏應該聲明並初始化「counter」變量(在我的例子中爲'var i = 0),以便'uniqueId'得到一個閉包嗎? –

+0

好的,想通了。 –

相關問題