Пасоны, можно ли такое использовать в реальном проекте если заморозить toString?
я про замену toString, ведь если его заменят, то мой не будет работать.... но я думаю в этом уже будет виновата рукожопость того кто заменяет функции не сохраняя старый функционал
var Map = (function () {
var last = null;
var _toString = Object.prototype.toString;
Object.prototype.toString = function () {
last = this;
return _toString.apply(this, arguments);
};
function Map () {
this.keys = [];
this.values = [];
}
Object.defineProperty(Map.prototype, '[object Object]', {
get: function () {
var index = this.keys.indexOf(last);
return this.values[index];
},
set: function (value) {
var index = this.keys.indexOf(last);
if (index !== -1)
return this.values[index] = value;
this.keys.push(last);
this.values.push(value);
return value;
}
});
return Map;
})();
var map = new Map();
var key = {a:2};
var key2 = {b:3};
map[key] = 9999999;
map[key2] = 'ololo';
alert( map[key] );
alert( map[key2] );
|
Я считаю, что если человек переопределяет стандартный метод или объект, то
|
С массивами не сработает.
|
Ну а вот это, убого смотрится или норм?
hash.objects = [];
function hash (value) {
var index = hash.objects.indexOf(value);
if (index === -1) {
index = hash.objects.push(value) - 1;
}
return '_hash:' + index
}
var map = {};
var key = {};
var key2 = {};
map[hash(key)] = 5;
map[hash(key2)] = 'ololo';
alert(map[hash(key)]);
alert(map[hash(key2)]);
но память не очищается... |
У меня есть реализация объекта Map из ES6, может пригодится :)
Object.prototype Вообще переопределение нативных методов это зло, особенно если твой код будут использовать другие. Переопределять можно, но только для дебага. Например если нужно провести профилирование приложения и подсчитать обработчики на элементах и пр. события. |
ну блин эти сеты и геты думаеш удобно кому? так и любой может сделать, суть то в том чтобы сахарно было))
|
Цитата:
Если тебе нужен сахар пиши на ruby, тот же JS только с кучей сахара |
тебе не кажется что эта реализация раз в 100 круче быстрее и проще?
function hash (value) {
var index = hash.objects.indexOf(value);
if (index === -1) {
index = hash.objects.push(value) - 1;
}
return '_hash:' + index
}
hash.objects = [];
var map = {};
var key = {};
map[hash(key)] = 5;
alert( map[hash(key)] );
|
Цитата:
|
| Часовой пояс GMT +3, время: 11:47. |