3 回答
TA贡献1794条经验 获得超7个赞
就我的观察而言,此处发布的任何答案都可能具有意想不到的副作用。
在与ES2015兼容的环境中,可以使用WeakMap避免任何副作用。
const id = (() => {
let currentId = 0;
const map = new WeakMap();
return (object) => {
if (!map.has(object)) {
map.set(object, ++currentId);
}
return map.get(object);
};
})();
id({}); //=> 1
TA贡献1786条经验 获得超11个赞
最新的浏览器提供了一种更干净的方法来扩展Object.prototype。此代码将从属性枚举中隐藏该属性(对于o中的p)
对于实现defineProperty的浏览器,可以实现如下的uniqueId属性:
(function() {
var id_counter = 1;
Object.defineProperty(Object.prototype, "__uniqueId", {
writable: true
});
Object.defineProperty(Object.prototype, "uniqueId", {
get: function() {
if (this.__uniqueId == undefined)
this.__uniqueId = id_counter++;
return this.__uniqueId;
}
});
}());
有关详细信息,请参见
添加回答
举报