имя метода оказывается в списке элементов хэша
задумал я сделать такую функцию:
{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. если Вы обладаете сакральным знанием о том, какой объект надо расширить, чтоб добавить метод в хеш, то тут самое место им поделиться. отмечу, что я об этом повторно спрашивал и ответа не получил (в гугле тоже искал). Цитата:
Цитата:
похоже, что это невозможно, поскольку выяснилось, что добавление в хеш элемента с ключом одноименным функции делает эту функцию недоступной. понятно излагаю? есть возражения? буду рад услышать. в особенности буду рад услышать, как же все-таки называется класс, который следует расширять вместо базового. |
var object = {
a: 1,
b: 2,
c: {
d: 3
}
};
Object.defineProperty(Object.prototype, 'dump', {
value : function() {
var output = [];
for (var i in this) {
if (this.hasOwnProperty(i))
{
var key = i + "=";
var value = this[i];
output.push(key += {
"[object Object]" : value.dump(),
"[string Object]" : "\"" + value + "\""
}[Object.prototype.toString.call(value)] || value);
}
}
return "{" + output.join() + "}";
},
configurable: 1,
writable : 0,
enumerable: 0
});
alert(object.dump());
|
за код - спасибо. про defineProperty по крайней мере - не знал.
но не знаю, мож я плохо объясняю. у меня нет проблем с функцией, которая делает это: Цитата:
проблема, повторю еще раз, в том, что, похоже, что нет возможности использовать одновременно ключ хеша и одноименную функцию:
console.log({a:1, b:2, dump: 3}.dump());
Цитата:
|
Это нихрена не баг, а вполне себе фича.)
|
x15nicky,
Да вы язык кажется не понимаете, функция - это тоже переменная, поэтому нельзя создать одноимённы метод и свойство. |
я это понимаю, и об этом писал выше. но всеж в PHP нет ограничений на имена ключей. в Руби - тоже. и если эта фича будет ликвидированна в будущих версиях, я думаю, никто о ней не пожалеет.
кто-то из вас, господа гуру мне минусанул карму на 8 сотен. я на вашем месте счел бы в такой ситуации за честь ее вернуть. Цитата:
Цитата:
Цитата:
|
Одноименное свойство можно только в прототип добавить:
var object = {
a: 1
};
object.__proto__.a = 2;
alert([object.a, object.__proto__.a]);
|
Нет никаких хэшей в JavaScript-е, есть объекты, которые иногда называют хэшами, но это одно и то же.
Цитата:
|
Цитата:
p.s. это не фича, а особенность языка |
| Часовой пояс GMT +3, время: 08:03. |