2

在打字稿中检测从没有运算符的类似类实例化的两个对象是否正确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 作为项目来创建 WYSIWYG 编辑器来学习 typescript。一般的想法是使用自定义处理程序重新创建常见的浏览器行为。我已经停止了文本样式并且一切正常,但是数据优化存在一个问题,该问题在具有相同样式的兄弟姐妹中得出结论。例如:方案。因此,当两个对象具有相同的样式时,它们应该合并为一个。

4

1 回答 1

1

您可以在此处阅读详细说明,但简而言之:

constructor 属性返回对创建实例对象的 Object 构造函数的引用。请注意,此属性的值是对函数本身的引用,而不是包含函数名称的字符串。

对于使用该new SomeClass(...)语法创建的对象,该.constructor字段将为SomeClass. 由于 JavaScript 与引用一起工作(对于布尔值等非原始类型),所以这是一个引用。因此,您正在检查两个值是否是使用同一个类实例化的。

那篇文章还提到该.constructor字段可以被覆盖等,因此您可以随心所欲地制作它。运算符实际上遍历了对象的instanceof原型链,尽管它使用了.constructor右侧值的属性。


对于您的用例,我不确定使用斜体/粗体的类是否是一个好主意。如果您不允许在样式文本中嵌套样式文本,至少不会。如果您想将文本格式化为斜体和粗体怎么办?如果您想要在红色(粗体)文本中间出现绿色粗体文本怎么办?拥有一个具有一组(CSS?)属性的通用类可能会更好StyledText,例如它是否是粗体/斜体、文本大小/颜色等。然后您可以合并StyledText具有相同样式的顺序对象。

于 2021-07-23T13:43:04.937 回答