Как создать метод, который возвращает значение по умолчанию, но также имеет метод расширения?

#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();