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

Мы можем создать что-то простое:

getName() { return 'My Name';}

И метод, который возвращает объект с большим количеством методов, таких как:

getName() {
    var name = 'My Name';
    return {
        raw: function() { return name; }
        decorate: function() { return '・°☆.。' + name + '.☆*・°☆'; }
    };
}

Как объединить две идеи, если еслиметод называется getName(), он возвращает строку.И в то же время вы все равно можете вызывать его методы, такие как getName().decorate() (или getName.decorate()?), Как методы расширения.

Ответы [ 2 ]

3 голосов
/ 03 апреля 2019

Если вы не передадите аргумент, который он использует, чтобы решить вернуть одну вещь или другую, вы не можете заставить getName возвращать что-то, что одновременно является строкой и не-строковым объектом. Вы можете получить 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 голос
/ 03 апреля 2019

Первое, что приходит мне в голову, это передать что-то в качестве параметра для вызова первым или вторым, вы выбираете.

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...