26.03.2012, 18:32
|
Интересующийся
|
|
Регистрация: 21.07.2011
Сообщений: 11
|
|
имя метода оказывается в списке элементов хэша
задумал я сделать такую функцию:
{a:1, b:2, s:3}.k_string() => 'a=1 b=2 c=3'
(чтоб группировать куки по темам).
и вот, что вышло:
Object.prototype.k_string = function()
{
var res = '';
var odd = 1;
for(var next in this)
{
res += next+'='+this[next]+' ';
}
return res;
};
var h = {a:1, b:2, s:3};
console.log(h);
console.log(h.k_string());
в консоле наблюдаем:
Object
a 1
b 2
s 3
Object
ifube.js:33
a=1 b=2 s=3 k_string=function()
{
var res = '';
var odd = 1;
for(var next in this)
{
res += next+'='+this[next]+' ';
}
return res;
}
то есть метод k_string(), которым я расширил Object оказался в списке свойств объекта.
подскажите плиз, с чего бы это и как с ним бороться?
сенки.
|
|
26.03.2012, 18:54
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от x15nicky
|
подскажите плиз, с чего бы это и как с ним бороться?
|
Как минимум, переписать нормально код, без расширения базового типа.
Про остальные варианты вам лучше пока не знать
|
|
26.03.2012, 19:09
|
Интересующийся
|
|
Регистрация: 21.07.2011
Сообщений: 11
|
|
да, я пробовал расширить Hash:
Uncaught exception: ReferenceError: Undefined variable: Hash
Error thrown at line 20, column 0 in [url]http://ifube.us/js/ifube.js?v=0.06:[/url]
Hash.prototype.k_string = function()
я конечно, далеко не гуру в JS, но мне кажется, что функциональность хэша = как раз базовая функциональноть Object-a
nasqad - хотелось бы сделать вариант, который не накладывал бы ограничений на значение ключа.
Последний раз редактировалось x15nicky, 26.03.2012 в 19:12.
|
|
26.03.2012, 20:37
|
|
''
|
|
Регистрация: 11.12.2011
Сообщений: 636
|
|
Вот вроде рабочий вариант
Object.prototype.k_string = function()
{
var res = '';
var odd = 1;
for(var next in this)
{
*!*if (!this.hasOwnProperty(next)) continue;*/!*
res += next+'='+this[next]+' ';
}
return res;
};
var h = {a:1, b:2, s:3};
console.log(h);
console.log(h.k_string());
|
|
27.03.2012, 11:35
|
Интересующийся
|
|
Регистрация: 21.07.2011
Сообщений: 11
|
|
работает, спасибо, заценил.
правда, оказалась такая досада - если в хеше есть элемент с индексом k_string (да хоть toString), то соответствующая функция оказывается недоступной.
с одной стороны - понятно, может существовать только один элемент с определенным ключом, но с другой - обращения к ним разные
h.toString - поле
h.toString() - функция
и если уж хеш является Object, то, наверное, можно как-то поля и методы разграничить.
кстати, правильный объект я тут расширяю, или для хеша есть что-либо более специфическое?
|
|
27.03.2012, 14:10
|
Интересующийся
|
|
Регистрация: 21.07.2011
Сообщений: 11
|
|
продолжаю. вобщем, не все так солнечно оказалось с расширением объектов. если в своей функции я могу анализировать имя очередного ключа, то в сторонних пакетах про это могут и забыть.
например вполне уважаемый Jqgrid получив хеш с параметрами, проверяет их на допустимость и ругается, увидев лишний. (хуже того - мрёт).
тут был намек, что есть и другие методы. может, с их помощью можно реализовать расширение объекта функцией, которая не попадала бы в список свойств?
|
|
27.03.2012, 15:05
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,576
|
|
monolithed, в самом начале всё правильно сказал.
А набижавшие после человеки вам зла хотят, точно вам говорю.
__________________
29375, 35
|
|
27.03.2012, 15:43
|
Интересующийся
|
|
Регистрация: 21.07.2011
Сообщений: 11
|
|
он правильно(?) намекнул, что расширяемый объект - не тот и что есть другие методы. и никаких намеков на то что можно было бы погуглить не воспоследовало, не говоря уже о том, чтоб привести правильный код.
|
|
28.03.2012, 12:59
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от x15nicky
|
и никаких намеков на то что можно было бы погуглить не воспоследовало
|
Интересно, что вам я вам должен был в этом случае посоветовать? Что такое функция или почему крайне не желательно без особых на то причин расширять расширять базовые типы и с чего вы вообще взяли что так принято делать без особых на то причин?
Сообщение от x15nicky
|
не говоря уже о том, чтоб привести правильный код.
|
Вот моя реализация функция print_r() вероятно она вам нужна
Последний раз редактировалось monolithed, 28.03.2012 в 13:01.
|
|
28.03.2012, 17:39
|
Интересующийся
|
|
Регистрация: 21.07.2011
Сообщений: 11
|
|
понятно, что не надо расширять базовый тип. НО, когда я отправляю в консоль {} она печатает Object:
Цитата:
|
Object
Object
__defineGetter__ Function
__defineSetter__ Function
__lookupGetter__ Function
__lookupSetter__ Function
constructor Function
hasOwnProperty Function
isPrototypeOf Function
k_string Function
propertyIsEnumerable Function
toLocaleString Function
toString Function
valueOf Function
|
это, вкупе с тем фактом, что класс Hash не существует, см. коммент
навело меня на мысль что хеш и есть Object. если Вы обладаете сакральным знанием о том, какой объект надо расширить, чтоб добавить метод в хеш, то тут самое место им поделиться. отмечу, что я об этом повторно спрашивал и ответа не получил (в гугле тоже искал).
Сообщение от monolithed
|
Вот моя реализация функция print_r() вероятно она вам нужна
|
нет, мне нужна функция, которая делает строго это:
Цитата:
|
{a:1, b:2, s:3}.k_string() => 'a=1 b=2 c=3'
|
и более того, хотелось бы сделать ее методом хеша и так, чтоб элемент хеша с одноименным ключом не делал бы этот метод (равно как и любой другой) недоступным. (с самой функцией, собственно, проблем нет.)
похоже, что это невозможно, поскольку выяснилось, что добавление в хеш элемента с ключом одноименным функции делает эту функцию недоступной.
понятно излагаю? есть возражения? буду рад услышать.
в особенности буду рад услышать, как же все-таки называется класс, который следует расширять вместо базового.
Последний раз редактировалось x15nicky, 28.03.2012 в 17:53.
|
|
|
|