質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

1099閲覧

DOMParserはなぜnewしてから使う設計になっているのでしょうか?

_kari_

総合スコア34

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/09/08 01:51

編集2021/09/08 02:33

JavaScriptのDOMParserについての質問です。

DOMParserのメソッドを使うとき、

JavaScript

1const domparser = new DOMParser(); 2const doc = domparser.parseFromString(str, "text/html");

のように、new演算子を用いてインスタンス化する必要がありますが、なぜこのような設計になっているのでしょうか?

JavaScript

1const doc = DOMParser.parseFromString(str, "text/html");

のように、静的メソッドとして提供したほうが使い勝手がいいと思うのですが。

JSONオブジェクトのメソッドの場合は、

JavaScript

1const json = JSON.parse(str); 2const jsonStr = JSON.stringify(value);

のように、インスタンス化しなくても(できませんが)、静的メソッドとして使えます。

DateやXHRなら、個別のインスタンスを作成するメリットがあるのはわかりますが、DOMParserの場合はどこがメリットなのかわかりません。
JSONと同じような仕様にならなかった理由が知りたいです。

追記
「設計思想まで突っ込んだ話なのか、回答者の私見を求めているのか、どちらなのかわからない」というご指摘がありました。
もともとは設計思想(仕様策定の際、どのような意図があってインスタンスメソッドという形態をとったのか)についての質問でしたが、それは仕様策定者しか知りえない、答えるのは不可能ということであれば、回答者の方の私見を伺いたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/09/08 01:57

これはあくまで私見を求めてますか? 設計思想まで突っ込んだ話ですか? 後者なら答えられる人は作った人しかいないです。
_kari_

2021/09/08 02:20

設計思想についての質問のつもりでしたが、答えられる方がいないならば、せっかくですので回答者の方の私見を伺いたいです。
m.ts10806

2021/09/08 02:23

はい。「私見で納得できる」という前提で答えて良いか質問内容では判断できませんでしたので。 念の為追記いただけますか?
_kari_

2021/09/08 02:34

追記を行いました。
guest

回答3

0

ベストアンサー

さいしょの仕様は DOM Level 3 Load and Save だと思いますが、この頃の LSParser は色々なプロパティとメソッドがあり、インスタンスを作る意味がありました。

ここから単純化した名残なのでしょう。

投稿2021/09/08 02:17

int32_t

総合スコア20929

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_kari_

2021/09/08 03:38

ありがとうございます。 腑に落ちました。 今更ながら、現在のDOMParserの仕様を見てみると、 "The design of DOMParser, as a class that needs to be constructed and then have its parseFromString() method called, is an unfortunate historical artifact. If we were designing this functionality today it would be a standalone function." と書いてありました。 この" an unfortunate historical artifact"というのがLSParser絡みの旧仕様のことなんでしょうね。
guest

0

HTML Standard 仕様

ご質問の件は「HTML Standard 仕様」に注釈があります。

Note: The design of DOMParser, as a class that needs to be constructed and then have its parseFromString() method called, is an unfortunate historical artifact. If we were designing this functionality today it would be a standalone function.

Google機械翻訳結果
「構築してからparseFromString()メソッドを呼び出す必要があるクラスとしてのDOMParserの設計は、残念な歴史的成果物です。今日この機能を設計しているとしたら、それはスタンドアロン機能になります。」

Re: kari さん

投稿2021/09/08 03:37

think49

総合スコア18166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_kari_

2021/09/08 03:43

ありがとうございます。 ちょうど私も仕様書を調べ、int32_tさんに返信したところです。 いまのところ、"an unfortunate historical artifact"はかつてのLSParserまたはそれに由来する他の旧仕様のことではないかと考えています。
guest

0

なんとも言えませんが他言語のDOMParserの仕様に引きづられているのでは?
javaの場合インスタンスにいくつかのメソッドが実行可能なようです。
javascriptの場合マイムを指定して文字列をDOMに読み替えるだけの
単機能なのでnewする仕様はたしかに必要ないかもしれません
逆にnewする場合でもインスタンスは必ずしも不要なので割り切って考えれば
いいだけだと思います

javascript

1const doc = new DOMParser().parseFromString(str,myme);

投稿2021/09/08 02:20

yambejp

総合スコア114915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_kari_

2021/09/08 03:55

ありがとうございます。 int32_tさんの回答から、他言語の仕様に引きずられているというよりは、元々同じDOM仕様に準拠して作られたので他言語と似た仕組みになっているのではないかと考えています。 「逆にnewする場合でもインスタンスは必ずしも不要」というのは、必ずしもインスタンスへの参照を変数に保持する必要はないという意味ですよね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問