имя метода оказывается в списке элементов хэша
задумал я сделать такую функцию:
{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 оказался в списке свойств объекта. подскажите плиз, с чего бы это и как с ним бороться? сенки. |
Цитата:
Про остальные варианты вам лучше пока не знать :) |
да, я пробовал расширить 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 - хотелось бы сделать вариант, который не накладывал бы ограничений на значение ключа. |
Вот вроде рабочий вариант
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()); |
работает, спасибо, заценил.
правда, оказалась такая досада - если в хеше есть элемент с индексом k_string (да хоть toString), то соответствующая функция оказывается недоступной. с одной стороны - понятно, может существовать только один элемент с определенным ключом, но с другой - обращения к ним разные h.toString - поле h.toString() - функция и если уж хеш является Object, то, наверное, можно как-то поля и методы разграничить. кстати, правильный объект я тут расширяю, или для хеша есть что-либо более специфическое? |
продолжаю. вобщем, не все так солнечно оказалось с расширением объектов. если в своей функции я могу анализировать имя очередного ключа, то в сторонних пакетах про это могут и забыть.
например вполне уважаемый Jqgrid получив хеш с параметрами, проверяет их на допустимость и ругается, увидев лишний. (хуже того - мрёт). тут был намек, что есть и другие методы. может, с их помощью можно реализовать расширение объекта функцией, которая не попадала бы в список свойств? |
monolithed, в самом начале всё правильно сказал.
А набижавшие после человеки вам зла хотят, точно вам говорю. |
он правильно(?) намекнул, что расширяемый объект - не тот и что есть другие методы. и никаких намеков на то что можно было бы погуглить не воспоследовало, не говоря уже о том, чтоб привести правильный код.
|
Цитата:
Цитата:
|
понятно, что не надо расширять базовый тип. НО, когда я отправляю в консоль {} она печатает Object:
Цитата:
навело меня на мысль что хеш и есть Object. если Вы обладаете сакральным знанием о том, какой объект надо расширить, чтоб добавить метод в хеш, то тут самое место им поделиться. отмечу, что я об этом повторно спрашивал и ответа не получил (в гугле тоже искал). Цитата:
Цитата:
похоже, что это невозможно, поскольку выяснилось, что добавление в хеш элемента с ключом одноименным функции делает эту функцию недоступной. понятно излагаю? есть возражения? буду рад услышать. в особенности буду рад услышать, как же все-таки называется класс, который следует расширять вместо базового. |
Часовой пояс GMT +3, время: 08:10. |