ES6如何覆盖toString()方法?

时间:2018-11-05 12:21:27

标签: javascript ecmascript-6 es6-class

在ES5样式的javascript中,要覆盖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课程中怎么可能?

3 个答案:

答案 0 :(得分:2)

这确实有效:

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开始不推荐使用此功能。

答案 1 :(得分:0)

您要首先实例化课程吗?如果我创建一个班级:

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"

答案 2 :(得分:0)

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

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

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