2017-01-21 3 views
3

は、私はかつて私たちが書く理由を学生に頼まれました:他の変数に適用されている間1は、パラメータとして変数を持っている理由ですJavaScript:なぜメソッドではないのですか?

  • parseInt(something)
  • something.toLowerCase()

、 。

toLowerCaseは文字列オブジェクトのメソッドですが、parseIntはそのようには設計されていないと説明しました。 OK、それはwindow.parseIntですが、それは別のオブジェクトのメソッドになります。

しかし、私は矛盾として私を襲った - なぜ文字列や他の関数が対応するオブジェクトのメソッドではないのですか?

質問はなぜですか? parseIntと他の関数がメソッドではないという技術的な理由はありますか、それとも単なる歴史的なものでしょうか?

+0

'parseInt'は「グローバル」で、実際は' window.parseInt'です - それは役に立ちます –

+0

@JaromandaXしかし、なぜですか?質問を編集して明確にします。 – Manngo

+0

@JaromandaX疑問は、 'something.parseInt()'の代わりに 'parseInt(something)'なのです。 – Xufox

答えて

3

一般的に、Javascriptは急いで設計されているため、個々のデザインの意思決定は常にあなたの時間を生産的に使うとは限りません。

は特にparseIntため、理由は説明するのは簡単です、と言った:それは次のように、ほとんど任意のタイプを受け付けます。

parseInt(undefined) // NaN 

あなたがundefined.parseInt()を実装することはできませんので、それを行うための唯一の方法でありますそれを静的関数として実装します。

ECMAScript 2015の時点でparseIntは、よりも理にかなっているNumber.parseIntに反映されています。下位互換性のため、window.parseIntは引き続き存在します。

+0

JavaScriptは10日間で書かれているかもしれませんが、それは長年にわたり、少し掃除する時間でした。私はそれが 'Number'オブジェクトにミラーリングされていることを知らなかったので、いくらか意味があります。未知の着信データを許可するのは、 'Number'オブジェクトの中にあることも意味があります。あなたはこの治療を受けた他の機能を知っていますか? – Manngo

+0

@Manngo:LOL。下位互換性は、通常、大部分のクリーンアップ作業を終了させます。どの言語でも。 Python3はそれを試しました、それは8年前にリリースされました。そしてpython2はまだまだ人気です.... –

+0

"理由は説明が簡単です" - それは鶏か卵か分かりません。あなたは狂った動的規則を持つ言語で引数を渡すので、何も受け入れないのは当然です。なぜ地球上で整数としての文字列以外のものを解析したいのですか?静的タイピングのメリットが大好きであれば、この中に深く感じることができます。 –

0

JavaScript言語の開発の進歩は、近年急速に進んでいます。これを念頭に置いて、後方互換性のために多くのことがAPIに残っています。それが唯一の理由だとは言えませんが。

JavaScriptでは、Object orientedパラダイム(オブジェクトのメソッドが通常は共通の状態を共有する)だけでなく、問題にアプローチできます。もう1つ、functionalのアプローチは、JavaScript言語であまり問題になることなく簡単に適用できます。

JavaScriptは、問題に近づく可能性のある多くのユーザーから大きな力を得ています。 「大いなる力は大きな責任をもたらします」という諺があります。

+0

オブジェクトのメソッドが何を意味するのかはよく分かりません*。 "機能的アプローチ"。 –

+0

私はそれをより明確に表現するために答えを少し編集しました。私はそれを「機能的アプローチ」と呼ぶつもりはないが、私は「オブジェクト指向」のパラダイムを指摘した。オブジェクト指向プログラミングでは、オブジェクトは通常、オブジェクトのメソッドによって変更された状態を保持します。機能的な世界は、副作用を避けるために概念的に異なります。 – user2694295

2

この具体的なケースでは、カプセル化に関して意味があります。

parseInt()を考慮してください - 不明な型から不明な型の値を取り出し、そこから整数値を抽出しています。あなたはどのオブジェクトにそのメソッドを持っていますか?それらのすべて?

String.toUpperCase()は入力として文字列を取ります(文字列としてキャストできるもの)。文字列を返します。これは、ケースの小さなサブセット内にうまくカプセル化されており、値が強く型付けされていないので、それをグローバル関数として持たないと論理的に思える。

JavaScriptの残りの部分については、わかりませんが、実際にこのように行われた理由についてはわかりませんが、これらの具体的な例では、合理的な設計決定であるようです。

関連する問題