ES6 如何覆盖 toString() 方法?

ES6 how to override toString() method?

在 ES5 风格 javascript 中,要覆盖 toString 方法,我只需执行以下操作:

function myFunction() {
}

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

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

在我当前的代码中,我使用 ES6,我的对象现在是一个 class(本质上是一个函数)。

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 class 中怎么可能?

这确实有效:

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 开始,此功能已被弃用。

您是先实例化 class 吗?如果我创建一个 class:

class myclass {}

并添加原型,甚至只是标准方式:

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

然后我可以实例化 class 并且它有效:

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

也许您正试图在静态的、未实例化的 class 本身上调用它。为此,您需要向 class.

添加一个静态方法
class myclass {
    static toString() {
        return "myclass toString"
    }
}

因此,当您在 class 的非实例化版本上调用它时,您会得到重写的方法:

myclass.toString()
> "myclass toString"

console.log()不会为你调用toString()方法...你还需要使用${}

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

let e = new MyAwesomeClass();
console.log(`${e}`);