Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Пасоны, можно ли такое использовать в реальном проекте если заморозить toString? (https://javascript.ru/forum/offtopic/37547-pasony-mozhno-li-takoe-ispolzovat-v-realnom-proekte-esli-zamorozit-tostring.html)

megaupload 24.04.2013 04:48

Пасоны, можно ли такое использовать в реальном проекте если заморозить 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] );

kobezzza 24.04.2013 09:14

Я считаю, что если человек переопределяет стандартный метод или объект, то его нужно сжечь это его проблемы.

Aetae 24.04.2013 14:03

С массивами не сработает.

megaupload 24.04.2013 19:13

Ну а вот это, убого смотрится или норм?

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)]);


но память не очищается...

monolithed 24.04.2013 22:49

У меня есть реализация объекта Map из ES6, может пригодится :)

Object.prototype

Вообще переопределение нативных методов это зло, особенно если твой код будут использовать другие.
Переопределять можно, но только для дебага.
Например если нужно провести профилирование приложения и подсчитать обработчики на элементах и пр. события.

megaupload 24.04.2013 22:53

ну блин эти сеты и геты думаеш удобно кому? так и любой может сделать, суть то в том чтобы сахарно было))

monolithed 25.04.2013 00:00

Цитата:

Сообщение от megaupload
ну блин эти сеты и геты думаеш удобно кому?

А в чем не удобство?
Если тебе нужен сахар пиши на ruby, тот же JS только с кучей сахара

megaupload 25.04.2013 00:42

тебе не кажется что эта реализация раз в 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)] );

monolithed 25.04.2013 16:53

Цитата:

Сообщение от megaupload
тебе не кажется что эта реализация раз в 100 круче и проще

Выглядит ужасно


Часовой пояс GMT +3, время: 06:45.