Методы цепочки и передать результат для следующей функции цепочки в Javascript - PullRequest
0 голосов
/ 30 января 2020

У меня есть этот пример кода:

let test = {

  result: '',

  bolder: function (str = this.result) {
    this.result = '<b>' + str + '</b';
    return test;
  },

  italic: function (str = this.result) {
    this.result = '<i>' + this.result + '</i';
    return test;
  },
}

console.log(
  test.bolder('text').italic()
)

/*
RESULT: 
{
  result: '<i><b>text</b</i',
  bolder: [Function: bolder],
  italic: [Function: italic]
}

EXPECTED:
'<i><b>text</b</i'
*/

Когда я передаю строку в функцию 'bolder', добавьте некоторый переносящий текст (возвращаемый результат должен быть похож на ' text '), а затем мне нужно, чтобы результат был передан следующей связанной функции 'itali c', чтобы он мог взять ' текст ' и добавить больше вещей, таких как текст </ b > ', затем верните это новое значение в следующую функцию и так далее. Если в качестве параметров не передается значение, то я предполагаю, что мне нужно отформатировать значение в «результате», поэтому это значение по умолчанию.

Но проблема заключается в следующем: Когда я пытаюсь зарегистрировать значение, если возвращается весь объект 'test' со всеми функциями и прочим, а не отформатированная строка ' text '.

Как мне этого добиться?

Ответы [ 3 ]

2 голосов
/ 30 января 2020

Вам нужен последний вызов для получения результата, возможно, с собственным методом toString.

let test = {
    result: '',

    bolder: function (str = this.result) {
        this.result = '<b>' + str + '</b>';
        return this;
    },

    italic: function (str = this.result) {
        this.result = '<i>' + this.result + '</i>';
        return this;
    },

    toString: function () {
        return this.result;
    }
};

console.log(test.bolder('text').italic().toString());
1 голос
/ 30 января 2020

Переопределение toString() - это путь к go.

Вы можете вызвать его явно, но его преимущество в том, что он автоматически вызывается при приведении его к строке, так как в Java или C#.

let test = {
    result: '',

    bolder: function (str = this.result) {
        this.result = '<b>' + str + '</b>';
        return this;
    },

    italic: function (str = this.result) {
        this.result = '<i>' + this.result + '</i>';
        return this;
    },

    toString: function () {
        return this.result;
    }
};

console.log("" + test.bolder('text').italic());

// oh and from ES6, you can use template literals
// see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
console.log(`use with template literal: ${test.bolder('text').italic()}`);
1 голос
/ 30 января 2020

Вы присваиваете свой результат свойству result - просто получите доступ к этому свойству в конце вызовов вашей функции

Вы также пропустили закрывающий > в своих функциях

let test = {
  result: '',

  bolder: function (str = this.result) {
    this.result = '<b>' + str + '</b>';
    return test;
  },

  italic: function (str = this.result) {
    this.result = '<i>' + this.result + '</i>';
    return test;
  },
}

console.log(test.bolder('text').italic().result)
...