#javascript #javascript-objects
#javascript #javascript-объекты
Вопрос:
Мы можем создать что-то такое простое, как:
getName() { return 'My Name';}
И метод, который возвращает объект с большим количеством методов, таких как:
getName() {
var name = 'My Name';
return {
raw: function() { return name; }
decorate: function() { return '・°☆.。' name '.☆*・°☆'; }
};
}
Как объединить две идеи, где, если метод a вызывается как getName()
, он возвращает строку. И в то же время вы все еще можете вызывать его методы, такие как getName().decorate()
(или getName.decorate()
?) точно так же, как методы расширения.
Ответ №1:
Если вы не передаете аргумент, который он использует для принятия решения о возврате того или иного объекта, вы не можете заставить getName
возвращать что-либо, являющееся одновременно строковым и нестроковым объектом. Вы можете получить close, но не настолько close, возвращая объект с помощью toString
метода, который возвращает строку (вы также можете предоставить valueOf
):
function getName() {
var name = 'My Name';
return {
toString() { return name; },
valueOf() { return name; },
decorate() { return '・°☆.。' name '.☆*・°☆'; }
};
}
console.log(String(getName()));
console.log("The name is: " getName());
console.log(getName());
console.log(getName().decorate());
Но помните, что он всегда возвращает объект. toString
запускается, когда что-то пытается преобразовать этот объект в примитив с подсказкой «строка». valueOf
запускается, когда что-то пытается преобразовать этот объект в примитив с подсказкой «число». (В обоих случаях, если первый метод недоступен или он возвращает объект, вызывается другой метод; подробности в спецификации.)
Комментарии:
1. Это здорово! Это самый близкий из возможных способов? третий
console.log
, как и ожидалось из вашего объяснения, возвращает весь объект.2. @ColdCerberus — Это настолько близко, насколько вы можете получить, да.
Ответ №2:
Первое, что приходит мне в голову, это передать что-то в качестве параметра для первого или второго вызова, на ваш выбор.
decorate = (name) =>
{
console.log('・°☆.。' name '.☆*・°☆');
return '・°☆.。' name '.☆*・°☆';
}
raw = (name) =>
{
console.log(name);
return name;
}
getName = (option) =>
{
var name = 'Name';
if (!option) { //default
console.log(name " Whatsup");
return name " Whatsup";
}
return (option === 'decorate' ? decorate(name) : raw(name));
}
getName();