1
下面的代碼(也在Plunker中)適用於this SO post。 我試圖執行相同的邏輯,只需在Object.prototype
的特殊屬性中添加uniqueId
函數以保持清晰。通過在「名稱空間」中添加函數來擴展對象原型
下面的代碼在使用nodejs
(也是HTML -ized Plunker示例也適用)運行時工作。即控制檯打印三個唯一的對象標識符:0
,1
和2
。
但是,當test
開關變量設置爲1時,控制檯打印0
,0
和0
。
如何在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()+']');
}
這裏應該聲明並初始化「counter」變量(在我的例子中爲'var i = 0),以便'uniqueId'得到一個閉包嗎? –
好的,想通了。 –