ÐобавÑÑе toString в ÑловаÑÑ
ÐмееÑÑÑ Ð¾Ð±ÑÐµÐºÑ dictionary, ÑозданнÑй Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Object.create(null) Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð»ÑбÑÑ
Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑение.
ÐобавÑÑе ÐµÐ¼Ñ Ð¼ÐµÑод dictionary.toString(), коÑоÑÑй должен возвÑаÑаÑÑ ÑпиÑок клÑÑей, ÑазделÑннÑÑ
запÑÑой. ÐÐ°Ñ toString не должен вÑводиÑÑÑÑ Ð¿Ñи иÑеÑаÑии обÑекÑа Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ñикла for..in.
ÐÐ¾Ñ Ñак ÑÑо должно ÑабоÑаÑÑ:
let dictionary = Object.create(null);
// Ð²Ð°Ñ ÐºÐ¾Ð´, коÑоÑÑй добавлÑÐµÑ Ð¼ÐµÑод dictionary.toString
// добавлÑем немного даннÑÑ
dictionary.apple = "Apple";
dictionary.__proto__ = "test"; // здеÑÑ __proto__ -- ÑÑо обÑÑнÑй клÑÑ
// ÑолÑко apple и __proto__ вÑÐ²ÐµÐ´ÐµÐ½Ñ Ð² Ñикле
for(let key in dictionary) {
alert(key); // "apple", заÑем "__proto__"
}
// Ð²Ð°Ñ Ð¼ÐµÑод toString в дейÑÑвии
alert(dictionary); // "apple,__proto__"
РмеÑоде можно полÑÑиÑÑ Ð²Ñе пеÑеÑиÑлÑемÑе клÑÑи Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Object.keys и вÑвеÑÑи иÑ
ÑпиÑок.
ЧÑÐ¾Ð±Ñ ÑделаÑÑ toString непеÑеÑиÑлÑемÑм, давайÑе опÑеделим его, иÑполÑзÑÑ Ð´ÐµÑкÑипÑÐ¾Ñ ÑвойÑÑва. СинÑакÑÐ¸Ñ Object.create позволÑÐµÑ Ð½Ð°Ð¼ добавиÑÑ Ð² обÑÐµÐºÑ Ð´ÐµÑкÑипÑоÑÑ ÑвойÑÑв как вÑоÑой аÑгÑменÑ.
let dictionary = Object.create(null, {
toString: { // опÑеделÑем ÑвойÑÑво toString
value() { // знаÑение -- ÑÑо ÑÑнкÑиÑ
return Object.keys(this).join();
}
}
});
dictionary.apple = "Apple";
dictionary.__proto__ = "test";
// apple и __proto__ вÑÐ²ÐµÐ´ÐµÐ½Ñ Ð² Ñикле
for(let key in dictionary) {
alert(key); // "apple", заÑем "__proto__"
}
// ÑпиÑок ÑвойÑÑв, ÑазделÑннÑÑ
запÑÑой, вÑведен Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ toString
alert(dictionary); // "apple,__proto__"
Ðогда Ð¼Ñ ÑоздаÑм ÑвойÑÑво Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð´ÐµÑкÑипÑоÑа, вÑе Ñлаги по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸Ð¼ÐµÑÑ Ð·Ð½Ð°Ñение false. Таким обÑазом, в коде вÑÑе dictionary.toString â непеÑеÑиÑлÑемое ÑвойÑÑво.
СмоÑÑиÑе Ð³Ð»Ð°Ð²Ñ Ð¤Ð»Ð°Ð³Ð¸ и деÑкÑипÑоÑÑ ÑвойÑÑв Ð´Ð»Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ.