Javascript ES6如何重写toString()方法?
在ES5风格的javascript中,要覆盖Javascript ES6如何重写toString()方法?,javascript,ecmascript-6,es6-class,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); class MyAwesomeClass { to
toString
方法,我只需执行以下操作:
function myFunction() {
}
myFunction.prototype.toString = function() {
return "My amazing function";
};
var myAmazingFunc = new myFunction();
console.log(myAmazingFunc);
class MyAwesomeClass {
toString() {
return "Awesome";
}
}
在我当前的代码中,我使用ES6,我的对象现在是一个类(本质上是一个函数)
我试图覆盖toString
方法的步骤如下:
function myFunction() {
}
myFunction.prototype.toString = function() {
return "My amazing function";
};
var myAmazingFunc = new myFunction();
console.log(myAmazingFunc);
class MyAwesomeClass {
toString() {
return "Awesome";
}
}
而且
class MyAwesomeClass {
// awesome code goes here
}
MyAwesomeClass.prototype.toString = function() {
return "Awesome";
};
同样没有原型
——但它似乎仍然没有被调用。
这在ES6课程中是如何实现的?这实际上是可行的:
class MyAwesomeClass{
toString(){
log(“调用toString”);
返回“真棒”;
}
}
log(新的MyAwesomeClass()+“!!!”)代码>您是否首先实例化该类?如果我创建一个类:
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"
console.log()
不会为您调用toString()
方法。。。您还需要使用${}
class MyAwesomeClass{
toString(){
log(“调用toString”);
返回“真棒”;
}
}
设e=newmyawesomeclass();
log(`${e}`)代码>我已经在Chrome控制台中进行了检查,您的两个解决方案都能正常工作。到底是什么问题?你的源代码是由巴别塔翻译的,这可能会引起一些副作用吗?没有翻译。在我的实际代码中,我还将console.log
放在toString
方法中,它没有打印出来。您试图调用toString
做什么?类还是对象?注意console.log(myAmazingFunc)
不执行toString
。您只是在浏览器中执行console.log(new MyAwesomeClass())
?因为浏览器的console.log
不会调用toString
,所以它会深入显示对象,并且字符串化所有内容会破坏调试功能。`console.log(“+newmyawesomeclass())怎么样?这将强制字符串化,作为连接所需的强制过程的一部分。另外,请注意,无论ES6类在做什么或不做什么,您的第一个ES5代码段都会做同样的事情。可能重复感谢。console.log
打印类的json
表示。它不是可以被toString
方法覆盖的吗?@developer82这里没有涉及JSON。JSON是一种文本序列化格式,类结构与JSON无关。谢谢。我的问题是,我认为toString
在console.log
上也会触发。如果我真的做了一个toString
,它就会工作。无法控制erlier?@developer82-如果您真的想更改console.log
的行为,您可以覆盖console.log
本身的定义,但首先要确保您确切知道自己在做什么以及为什么要这样做。当然可以<代码>让oldlog=console.log.bind(console);console.log=(…args)=>oldlog(…args.map(x=>x.toString())
-但一旦需要调试任何东西,您就会讨厌它,(提示:[object object]
)这不是它。OP的toString
工作正常。问题是,他希望console.log
为他调用它,但console.log
完全是这样。