Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6如何重写toString()方法?_Javascript_Ecmascript 6_Es6 Class - Fatal编程技术网

Javascript ES6如何重写toString()方法?

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

在ES5风格的javascript中,要覆盖
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
完全是这样。