ES6 как переопределить метод toString ()? - PullRequest
0 голосов
/ 05 ноября 2018

В javascript стиле ES5, чтобы переопределить метод toString, я бы просто сделал следующее:

function myFunction() {
}

myFunction.prototype.toString = function() {
    return "My amazing function";
};

var myAmazingFunc = new myFunction();
console.log(myAmazingFunc);

В моем текущем коде я использую ES6, и мой объект теперь является классом (который по сути является функцией).

class MyAwesomeClass {
    // awesome code goes here
}

Что я пытался сделать, чтобы переопределить метод toString, так это:

class MyAwesomeClass {
    toString() {
        return "Awesome";
    }
}

А также

class MyAwesomeClass {
    // awesome code goes here
}
MyAwesomeClass.prototype.toString = function() {
    return "Awesome";
};

Также без prototype - но все равно не похоже, что его вызывают. Как это возможно в классе ES6?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Вы сначала создаете экземпляр класса? Если я создаю класс:

class myclass {}

и добавьте прототип, или даже просто стандартным способом:

myclass.prototype.toString = () => "hi"
// or, using the class syntax
class myclass {
    toString() {
       return "hi"
    }
}

тогда я могу создать экземпляр класса, и он работает:

new myclass().toString()
> "hi"

Возможно, вы пытаетесь вызвать его для самого статического, необоснованного класса. Для этого вам необходимо добавить статический метод в класс.

class myclass {
    static toString() {
        return "myclass toString"
    }
}

Таким образом, когда вы вызываете это для неинстанцированной версии класса, вы получаете переопределенный метод:

myclass.toString()
> "myclass toString"
0 голосов
/ 05 ноября 2018

Это действительно работает:

class MyAwesomeClass {
  toString() {
    console.log("toString called");
    return "Awesome";
  }
}

console.log(new MyAwesomeClass() + "!!!");

Должно быть что-то не так с тем, как вы тестируете (подсказка: console.log не запускает toString).

Если вы ищете способ настроить вывод console.log, это возможно только в файле node.js (https://nodejs.org/api/util.html#util_custom_inspection_functions_on_objects), путем добавления пользовательского метода inspect. Эта функция устарела, хотя с узел 10.

...