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}`);
在 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}`);