Ric*_*dor 9 javascript ecmascript-6 es6-class
我对实现什么感到困惑,首先,我的模块将使用Babel,因此实现ES6功能没有问题,其次,我将使用class构造来创建类而不是旧的原型方法.所以现在,我很困惑,如果我要覆盖toString(这是旧的方式)或只是实现Symbol.toStringTag,就像这个MDN文档说的那样,https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toStringTag
那么推荐的方法是什么?
T.J*_*der 23
他们完全是为了不同的事情.
如果您尝试定义对象的字符串版本,请提供toString方法.
如果您尝试向Object.prototype.toString将用于构建其"[object XYZ]"字符串的类添加信息,请提供名称为值的方法Symbol.toStringTag.
以下是差异的说明:
class Example {
constructor(x) {
this.x = x;
}
toString() {
return `Example[x=${this.x}]`;
}
get [Symbol.toStringTag]() {
return "Example";
}
}
const e = new Example(42);
console.log(e.toString()); // Example[x=42]
console.log(String(e)); // Example[x=42]
console.log(Object.prototype.toString.call(e)); // [object Example]Run Code Online (Sandbox Code Playgroud)
如果我们没有提供get [Symbol.toStringTag],那最后一行将输出"[object Object]"而不是"[object Example]".
需要注意的是它不具备成为一个getter,它可以是一个数据属性.由于您使用的是Babel,因此如果您包含公共类字段支持(当前为阶段2),则可以将其定义为:
class Example {
constructor(x) {
this.x = x;
}
toString() {
return `Example[x=${this.x}]`;
}
[Symbol.toStringTag] = "Example";
}
Run Code Online (Sandbox Code Playgroud)
......虽然它当然是可写的.交替:
class Example {
constructor(x) {
this.x = x;
}
toString() {
return `Example[x=${this.x}]`;
}
}
Object.defineProperty(Example.prototype, Symbol.toStringTag, {
value: "Example"
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4547 次 |
| 最近记录: |