2

instanceof演算子なしで同様のクラスからインスタンス化された2つのオブジェクトを検出するのはtypescriptの正しい方法ですか?

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 を学習する WYSIWYG エディターを作成しようとしています。一般的な考え方は、カスタム ハンドラーを使用して一般的なブラウザーの動作を再現することです。私はテキストのスタイリングをやめ、すべてうまくいきましたが、同じスタイルを持つ兄弟で終わるデータの最適化に問題があります。例:スキーム。したがって、2 つのオブジェクトのスタイルが同じ場合は、1 つにマージする必要があります。

4

1 に答える 1

1

ここで完全な説明を読むことができますが、要するに:

constructor プロパティは、インスタンス オブジェクトを作成した Object コンストラクター関数への参照を返します。このプロパティの値は、関数の名前を含む文字列ではなく、関数自体への参照であることに注意してください。

new SomeClass(...)構文で作成されたオブジェクトの場合、.constructorフィールドはSomeClass. JavaScript は参照 (ブール値などの非プリミティブ) を処理するため、それが参照です。したがって、両方の値が同じクラスを使用してインスタンス化されたかどうかを確認しています。

その記事には、.constructorフィールドを上書きできるなどについても言及されているため、好きなように作成できます。演算子は、右側の値のプロパティを使用しますが、instanceof実際にはオブジェクトのプロトタイプ チェーンをトラバースします。.constructor


あなたのユースケースでは、斜体/太字のクラスを使用することが良いアイデアかどうかはわかりません. 少なくとも、スタイル付きテキスト内にスタイル付きテキストをネストすることを許可しない場合はそうではありません。テキストを斜体と太字の両方に書式設定したい場合はどうすればよいでしょうか? 赤 (太字) のテキストの真ん中に緑の太字のテキストが必要な場合はどうすればよいでしょうか? StyledText太字/斜体かどうか、テキストのサイズ/色など、一連の (CSS?) プロパティを持つジェネリック クラスを使用する方がよい場合があります。その後、連続しStyledTextたオブジェクトを同じスタイルでマージできます。

于 2021-07-23T13:43:04.937 に答える