constructor - TypeScript:有没有其他方法可以检测两个由相似类实例化的对象?
在 TypeScript 中,有没有正确的方法在不使用 instanceof 操作符的情况下检测两个对象是否由相似的类实例化?
abstract class CommonText {}
class BoldText {} extends CommonText
class ItalicText {} extends CommonText
const someBoldText = new BoldText("I like");
const anotherBoldText = new BoldText("cookies");
const italicText = new ItalicText("cursive");
//Comparison
if(someBoldText.constructor === anotherBoldText.constructor) {
// Run operation
}
if(someBoldText.constructor === italicText.constructor) {
// Should not be executed
}
它工作正常,但有点丑,我觉得有更好的方法可以做到这一点。
子问题:你能否向我解释一下在这种情况下到底比较的是什么?是指针吗?还是签名?
我正在尝试使用 TypeScript 和 Vue.js 创建一个所见即所得编辑器,作为学习 TypeScript 的项目。总体思路是使用自定义处理程序重现常见的浏览器行为。我已经在文本样式部分停下了,目前一切正常,但存在数据优化问题,导致具有相同样式的兄弟节点出现重复。例如:Scheme。所以,当两个对象具有相同的样式时,它们应该合并为一个。
答案#1
你可以在这里阅读详细的解释,但简而言之:
constructor 属性返回一个对创建该实例对象的 Object 构造函数的引用。请注意,该属性的值是对函数本身的引用,而不是包含函数名称的字符串。
对于使用 new SomeClass(...) 语法创建的对象,.constructor 字段将是 SomeClass。由于 JavaScript 采用引用方式处理(对于非原始类型如布尔值),它就是一个引用。因此,你是在检查两个值是否使用同一个类实例化。
那篇文章还提到 .constructor 字段可以被重写等等,所以你可以把它设置成任何你想要的值。instanceof 操作符实际上会遍历你的对象的原型链,尽管它使用的是右侧值的 .constructor 属性。
对于你的使用场景,我不确定使用类来表示斜体/加粗是否是一个好主意。至少如果你不允许在带样式的文本中嵌套带样式的文本,这样做就不太合适。如果你想让文本既斜体又加粗怎么办?如果你想在红色(加粗)文本中间加上一段绿色加粗文本呢?可能更好的是有一个通用的StyledText类,它有一组(CSS?)属性,比如是否加粗/斜体、文本大小/颜色等。然后你可以将样式相同的连续StyledText对象合并起来。