Пасоны, можно ли такое использовать в реальном проекте если заморозить 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, время: 06:45. |