• ベストアンサー

JSのアロー関数について

アロー関数はargumentsがない、thisがbindされている、newできないと聞いたのですが、 これは一体どういうことなのでしょうか? 初心者にもわかるように解説していただけるとありがたいです。 newできないとはオブジェクトを作成できないということなんですかね?

noname#226032
noname#226032

質問者が選んだベストアンサー

  • ベストアンサー
  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.7

「arguments」は「引数」という意味ではありません。 「arguments」はES5以前にしばしば使われていた、「this」と同じく関数内で効果を表す「キーワード」です。 「arguments」は、その関数に渡された全ての引数の配列のような存在です。 例えば、arguments[0]で第一引数を、arguments[1]で第二引数を得られます。 これは、幾つの引数を渡されるか分からないような関数、(例えばMath.maxのような任意の数の引数全ての中から最大の数を返す関数)において、必須のものでした。 しかし、「arguments」には配列のようで純正配列ではなかったという問題があったりして、 ES2015以降は、これに変わるレストパラメータ構文がありますので、今では非推奨に極めて近い機能であり、もう古いコードを読むということ以外では知らなくて良いことです。 そもそも、可変長関数という存在が、現在ではあまりスマートとは見られません。一部の低レベルな関数以外はそぐわないでしょう。 幾つかの値を渡したいのなら、配列として渡すように設計するのが無難です。 そして、newできないとは、new演算子が適応できない(例外を吐く)ということです。 つまりは、「hoge = new Hoge()」のHogeの部分にアロー関数は使えないということです。 そもそも、本来は使える通常の関数のほうが、『異質』なのです。 本来、オブジェクト生み出すということは、クラスベースのOOP(オブジェクト指向プログラミング)言語では、 クラス(抽象、型、ハンコの押す方)に対して、new演算子を使うことにより、 クラス内に定義されたコンストラクタと呼ばれる関数が働き、クラスの情報を受け継いだ、 インスタンスオブジェクト(実態、物、ハンコの押された印)を生成するということなのです。 しかしJSはプロトタイプベースのOOP言語です。 クラスベースと何が違うかというと、 クラスベースでは「クラス」という抽象的な構造を受け継いだ実態として、「オブジェクト」があります。 つまりオブジェクトはクラスと繋がっているわけです。 しかし、この仕組みは整頓されたコードを書くために通常貢献しますが、ちょっと変わったことをしたい場合には融通が利かないし、簡単なことをしたい時にオブジェクトを気軽に作れないのは面倒という問題がありました。 そこで生まれたのがプロトタイプベースで、オブジェクトの生成を「クラス」に縛られることなくできるようにしたのです。 例えば「{}」でオブジェクトが作り、自由に弄れるというのは、実はすごいことなのです。 そしてプロトタイプベースでは、オブジェクトは「プロトタイプ」と呼ばれる別のオブジェクトへの参照を持ち、自身のプロトタイプオブジェクトの形質を受け継ぐような格好で、オブジェクト指向を実現しています。 オブジェクトは、オブジェクトと繋がっているのです。 話を少し戻して、つまりJSでは本来「クラス」は無いし、クラスに適応するためのnew演算子も不要なのです。 そんなことをしなくとも、気軽に自由にオブジェクトを作れるのですから。 ですけれど、気軽に自由にという状態は必ずしも良いことだけではありません。 皮肉なことですが、人間はある程度制約があったほうが上手く動けるのです。 よってJSには、特定の形質を持つオブジェクトを作る方法として、クラスベースと見た目が似た仕組みが入れられる事になりました。 これが現在まで続き、ES2015以降ようやく収まりつつある混乱の元、JSの闇なのです。 今はよりまともな「Class構文」がありますし、JS本来のプロトタイプベースでのOOPもやりやすくなっているので、普通に作った関数にnewするといったことも、過去を気にしなければもう忘れていっても良いようなことです。 そしてクラスベースと見た目が似た仕組みが入れられる事にはなったものの、JSには「クラス」がありませんから、別のものがその役目を持つことになりました。 それが「関数」です。 「関数」オブジェクト自身の「prototype」プロパティ下のオブジェクト(※これと「プロトタイプオブジェクト」を混同しないでください!!理解できたらJS中級※)に、インスタンスオブジェクトの形質をプロパティとして定義することで「クラス」のような役割を持たせ、またnew演算子が適応されたときに自身が「コンストラクタ」として振る舞うようにしたのです。 ちなみに、new演算子が実際やっているのは大体、「コンストラクタ関数オブジェクト」の「prototypeプロパティであるオブジェクト」を「プロトタイプ」としたオブジェクトを作成(これがインスタンスオブジェクト)し、そのインスタンスオブジェクトをthisとしてコンストラクタ関数に通し初期化などをさせ、演算子の結果として返すということです。 ここで大事なことですが、new演算子は「コンストラクタ」に適応されます。 「コンストラクタ」としての機能を持たないものには適応できません(例外を吐きます)。 そして、通常の関数は定義されたときに、関数としての「()」演算子で呼べるという機能の他に、「new」演算子で呼び出せるという機能も付けられるのです。 しかし、より『ピュア』な関数を目指したアロー関数では後者の仕組みを持ちません。 よってnew演算子はアロー関数には使えない(例外を吐く)、アロー関数からインスタンスオブジェクトを生成することはできない、ということです。

その他の回答 (6)

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.6

分からない単語を辞書やWikipediaで調べたことがあるならわかると思いますが、 馴染みのない分野の場合、調べて分からない単語をまた調べて……と収集が付かなくなりますよね。 それと同じで、一つのことを理解するためには多くの前提知識が必要ですから、その分野に入門していきなり何かを理解することは不可能なのです。 ただそれは、勿論調べたり勉強しなくていいということではありません。 そうではなくて、一度勉強する度に、または一日勉強で、その物事の1%も理解できれば御の字という気持ちをもてばいいのです。 日本語が分かれば、説明をそれなりに見てしっかり試せば、取り敢えず分かっていないうちの1%近くは掴むことができます。 今分かりそうにないことは、「そういう事が書いてあった」程度に覚えておいて、深入りせず無視して置けば良いのです。 そういう部分で「調べて分からない単語をまた調べて……」というこだわりを頑張っても疲れるだけです。 そういった頑張りのしどころは、もう少しで分かりそうというところです。 もう少しで分かりそうという壁に達し、気分が高揚し頭が火照っているときのみ、こだわりをぶつければ、いきなり5%とか理解することもできるのです。 それは言わば勉強における奥義のようなもので、逆に言えば普段の勉強は静かに奥義のための力を貯める鍛錬なのです。

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.5

そりゃあ難しいです。 プログラミング言語学習では、何でもいきなり理解できると思わないほうが良いです。 「言語」ですから、特に最初は理屈ではなく、浅く何度も触れて慣れる・馴染むことが大事なのです。 学者のように品詞を理解していなくとも誰もが母国語を使えるように、 プログラミング言語も、それはあくまで目的を遂行するための「道具」なのですから その性質や仕組みに気を取られること無く、自然と目的だけを考えて使えることが何よりも理想なのです。 取り敢えず、アロー関数はargumentsがない、newできないとだけ覚えとけば十分なのです。 argumentsやnewについて詳しくなった時その意味が分かってきます。 逆に言うと、そうでないうちは幾ら解説されても分かることはありません。 取り敢えず最低一年はJSをみっちりやったレベルの人が気にし始めてもいいようなことです。 そして本当に仕様レベルで理解できるのは5年はかかるでしょうね。

noname#226032
質問者

お礼

JS本格入門レベルの内容は、わかっていなくても、WEBアプリをガリガリ書けて、とりあえず動けば、まず良いと考えるべきなのでしょうか? 数年そのように作っているうちにわかるようになり、その時にこのレベルのことは学べばよいということでしょうか? わからないまま作っていってもダメなのかと思いましたが、 それでもいいのですね。 >>> アロー関数はargumentsがない、newできない 引数はありますが、具体的にどういう意味でしょうか? newできないとはオブジェクトの作成のnewのことですか? もう少し初心者にもわかるように解説していただけるとありがたいです。

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.4

通常の関数の場合、 function f1(a, b, c) { } と書いた場合は、暗黙的に function f1(this, a, b, c) { } と書いている(実際に書くことはできませんが)ようなものなのです そして、このf1関数がobjオブジェクトにあった場合、 obj.f1(1,2,3)と呼ぶということはドット演算子の効果で、 f1(obj,1,2,3)と呼んでいるということになります。 ここでf1の中からthisを参照すれば、ローカル変数である暗黙の引数thisが使われるのです 一方アロー関数の場合は f2 = (a, b, c) => {} と書いた場合、 f2 = (_, a, b, c) => {} のような感じで、渡される暗黙の0番目の引数をthisという名前のローカル変数に格納する仕組みを持ちません よって、f2の中からthisを参照すれば、ローカル変数はありませんから、関数外の最も近いthisを指すことになるのです。

noname#226032
質問者

補足

難しいです

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.3

>>コンテキストのオブジェクトがthisとなります →定義された場所でのthisとなります t0 = this o1 = { f: function() { return this } } o2 = { f: () => { return this } } console.log( o1.f() == o1 ) // true console.log( o2.f() == t0 ) // true 通常の関数定義で作られた関数におけるthisとは、『第0番目の引数』です つまり呼び出し時に、呼び出し方に応じた値になります アロー関数の場合は、この仕組が存在しません よって他の変数と同じように、関数外のthisを指します

noname#226032
質問者

お礼

>>> 通常の関数定義で作られた関数におけるthisとは、『第0番目の引数』です t0 = this o1 = { f: function() { return this } } o2 = { f: () => { return this } } console.log( o1.f() == o1 ) // true console.log( o2.f() == t0 ) // true こちらのどれが0番目の引数なのですか? アローだと関数外のthisを取得すると変わるということですか? 外の下から近いものになるのですか?

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.2

まあ、初心者が理解するのはかなり難しいと思います。 JSのオブジェクト指向を理解して、thisとnew周りの挙動をまず理解しなければなりません。 それから、今はもう使うべきでない過去の遺産のargumentsや、JSerのthisに対する苦悩の歴史を把握して初めて分かることです。

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.1

function文で作った関数は、関数であると同時にコンストラクタでもあります。 従って、new演算子を適応して、インスタンスを作成することができます。 しかしアロー関数はよりピュアな関数を目指したものであるため、コンストラクタの機能を持ちません。 そして、thisは他の変数と同様にレキシカルに解決されます。 よくbindされているという解説がありますが、これは誤りです。むしろその逆で開放されているのです。 また、argumentsもレストパラメータで代用可能なので機能を持ちません。

noname#226032
質問者

お礼

どんなに調べての下記以上に簡単なサイトが見つかりません。 https://thinkit.co.jp/article/10471 thisの値を束縛することに注意が必要です。function式ではthisは自身を参照していましたが、アロー関数式でオブジェクトのメソッドとして呼び出された場合は、コンテキストのオブジェクトがthisとなります。 コンテキストのオブジェクトがthisとなります。がさっぱりわかりません。

関連するQ&A

  • アロー演算子について

    php素人です アロー演算子についてわかりやすく教えてください クラスとか使ったことありませんのでアロー演算子をみるとパソコンの前から逃げ出したくなります 質問1 アロー演算子を使うときはクラス内の変数などにアクセスするときだけですか?(普通はclassを使わない場合、アロー演算子は使わないのですか?) 質問2 他のファイルから呼び出す場合はrequire_onceなどをつかってからアロー演算子でよびだすのですか? 質問3 PDOもrequire_onceなどで呼び出してからつかってるのですか? 質問4 下記のようにclassを定義する前にnewでオブジェクトを出現させても大丈夫なんですか? 質問5 アロー演算子とはクラスから変数や関数を使うためのものですか?下記の場合、 $hoge変数にclass numberdayoの処理が詰まっているってことでしょうか? $hoge = new numberdayo(); $hoge ->number = 2; $hoge ->numberdayo(); class numberdayo{ public $number; function numberdayo(){ print($this -> number); } } 質問6 別の質問ですが、classをつかってない単なる関数functionは定義する前に呼び出せますか? hoge(); function hoge(){ print("関数"); } よろしくお願いします

    • ベストアンサー
    • PHP
  • 用語/newを伴わないコンストラクタの呼出=関数?

    コンストラクタを勉強しているのですが、「用語」「意味」が分からないので、教えてください ■質問1 ・いついかなる時でも、「コンストラクタ関数」=「コンストラクタ」=「関数」=「メソッド」なのでしょうか? ・例えば、「newをつけずに、コンストラクタを関数として呼ぶ」場合も、「コンストラクタを実行する」と言うのでしょうか? ■質問2 … 「new」付与による相違 ・「new」付与しないと、「コンストラクタ」内で「this」が指し示す対象が異なる(グローバルオブジェクトになってしまう)のだと思うのですが、それ以外に何か相違点はあるのでしょうか? ・「new」付与しないとオブジェクトが正しく生成されないので、不具合が生じる可能性がある? ■質問3 ・「new」を付けずに、オブジェクトを関数として実行するのは、例えばどういう使い方をするときなのでしょうか?

  • [JS] private関数からオブジェクト参照

    JavaScriptにて外部から使用する関数をpublicに、内部的に使用するだけの関数をprivateにしたく、 <http://d.hatena.ne.jp/brazil/20051028/1130468761>や<http://www.findxfine.com/programming/javascript/59.html>を参考に以下のようにしてみました。 func1はtestクラス内からしか呼び出せず、privateになっており、 func2はtestクラス外からも呼び出せて、publicになっているようです。 しかし、func2からfunc1を呼び出した際に、func2の呼び出しもとのオブジェクトを参照しようとすると undefinedになってしまいます。 var a = new test(); //a.func1(); // これはprivateなのでエラー a.func2(); // こちらはpublicなのでOK function test(){ var self = this; // private variable var data1 = 1; // public variable this.data2 = 2; // private function function func1(){ console.log(data1); // 1を表示 console.log(this.data2); // これがundefinedとなってしまう } // public function this.func2 = function(){ console.log(data1); // 1を表示 console.log(this.data2); // 2を表示 func1(); }; } どのようにすれば、オブジェクト変数を参照でき、 クラス内でのみ使用可能なprivate関数を定義できるのでしょうか。

  • ダブルコロンとアロー演算子

    ダブルコロンとアロー演算子は共に関数の呼び出しと認識しているのですが、具体的にどこが違うのでしょうか? 初心者質問で恐縮ですが、宜しくお願いします。

  • JSのクラスについての質問

    JSのクラスについての質問 ソース class Cat { constructor(name) {this.name = name} meow() {alert( this.name + 'はミャオと鳴きました' )} } //インスタンス作成 var clsObj = new Cat("my cat"); //インスタンス(オブジェクト)の中身を出力 console.log(clsObj); 初心者なのでこの中のどの記述が必須で、 またnameはどれと対になっているかがわかりません。 インスタンスはnew クラス名 となっている所で作成されて変数に作られたインスタンスが代入されるというのは何となく分かったのですが、 console.log(clsObj); VM793:9 Cat {name: "my cat"} となるのがいまいちわかりません。 new Cat("my cat");は class Cat { constructor(name) {this.name = name} meow() {alert( this.name + 'はミャオと鳴きました' )} } を実行するという事で、 引数は constructor(name) new Cat("my cat"); が対になっているのでnameがmycatに代わるという事でしょうか? new Cat("my cat");が実行された結果がインスタンスという事ですが、 mycatがインスタンスなのですか? 大変恐縮ですが、簡単に一連の流れを教えていただければ幸いです。 class Cat { constructor(name) {this.name = name} meow() {alert( this.name + 'はミャオと鳴きました' )} } にどう渡されてどのように処理され何がインスタンスとして吐き出されるのでしょうか?

  • JSのクラスについて

    JSのクラスについて https://okwave.jp/qa/q9320085.html の続き >>> >するとCat.nameとなりCatクラスという箱の中に入っているnameプロパティ?いや引数という事なのでしょうか? 引数ではなくプロパティです、ここではクラス内部のローカル変数と説明しているモノです(初心者に分かりやすいか どうかは別としてプロパティと言った方が正確ですね)。 関数内部(関数が持っている)のローカル変数は ご存知ですか?、それに類似しています、この場合はクラス内部(クラスが持っている)のローカル変数と言うイメージです。 Cat.nameとなりCatクラスという箱の中に入っているnameプロパティなのですね。 nameとコンストラクタの引数があるのでthis.nameのnameも引数なのかと思ったのですが、ドットつながりなのでcatクラス(オブジェクト)の中にあるnameプロパティ という事ですね。 関数のスコープの中で宣言する変数のことですよね。 巻き上げが起こる変数ですね。 これとクラス内の変数はほぼ同じ挙動をするという事ですか? するとスコープがクラスにもあるのでしょうか? 巻き上げも >>> >なぜこの例えはこんなわかりにくいことをしたんですかね? 恐らく同じ名前でも「this.」が付いてるか付いてないかで区別できるので、同じ名前でもコンフリクト(衝突、競合)せずに使えると言う例を示したかったのかもしれません。 thisで別の引数?の物と区別できるという事を伝えたかったのですね。 ただ二つはコンストラクタの引数でthis.nameだけはそもそも引数ではなくプロパティなので、 仮にかぶっても問題ないのでしょうね。 >>> >変数と似ている箱で 変数と違う箱と考えて下さい。 オブジェクト、クラス、関数、変数などいろいろな箱がありこんがらがるのですが、 もしかしてこれらはすべて変数なのですか? つまり箱はすべて変数で、これらは少し個性の違う変数なのでしょうか? >>> >特殊な箱でなんでも好きに入れ替えできず、 >入れられるものと入っていなくても良いものが固定されている箱という事でしょうか? >つまり変数と違ってコンストラクタが絶対に入っている箱なのですね。 初期設定が必要ないなら、コンストラクタは必要ないようです。 クラスをインスタンス化したい場合のみコンストラクタは必要で、 インスタンス化が不要なクラスなら必要ないという事でしょうか? ただクラスはインスタンス化しないと利用できないので、 文法上はコンストラクタなしでも良いが、実際はそのようなことはあり得ないという事でよいでしょうか? またインスタンス化と初期設定の違いが判らないのですが、イコールと考えてよいでしょうか? >>> >入れられないものもあるのですか? クラス内クラスは無理なようです。 それ以外はオブジェクトのように入れられるのですね。 >>> >var コンストラクターの「name」= my cat;という事ですかね? その説明は変な感じです、実際のプロセスを考えて下さい(「my cat」ではなく"my cat"文字列です)。 new Cat("my cat") ←ここでコンストラクターの「name」仮引数に"my cat"文字列が代入され、「constructor(name) {this.name = name}」が呼ばれます。 constructor(name) {this.name = name} とは constructor関数の中に中カッコ内の式があり、 catクラス内のnameプロパティにconstructorの引数nameを代入するという事ですよね。 不思議なのはconstructorの引数nameを代入する部分なのですが関数の引数を代入するというのは初めて見ました。 仮引数nameなので constructor(name) { var name = "my cat"; this.name = name } という事ですよね。 つまり下記のcatクラスの引数が実引数になるという事ですよね。 //インスタンス作成 var clsObj = new Cat("my cat"); 関数であれば関数の呼び出しにある引数が実引数として代入されますが、 クラスの場合はconstructor関数の呼び出しにある引数ではなく クラスのインスタンス化にある引数が実引数として代入されるというルールなのですね。 constructor関数の呼び出しがないのが不思議でしたが、 constructor関数は定義するだけで呼び出しはしなくても実行されて、インスタンスを作成するのですね。 そして constructor(name) { var name = "my cat"; this.name = "my cat" } となりプロパティnameに文字列mycatが代入されるのですね。 >>> 「インスタンスの引数」と言うのは違います。 new Cat("my cat"):Catクラスに実引数"my cat"文字列を設定しnewすると、コンストラクターの「name」仮引数に"my cat"文字列が代入され、「constructor(name) {this.name = name}」が呼ばれ、インスタンスが生成されます。 こちらも上記の説明で正しいでしょうか? >>> コンストラクターが在る場合もコンストラクターは初期設定だけです。 クラス"設計図"からインスタンス"実態"を作成すると言う事で、例えるなら十徳ナイフの"設計図"から十徳ナイフの"実態"を作成すると言うイメージして下さい。 (十徳ナイフの"実態"を作成しても)十徳ナイフが置いてあるだけでは何も役に立ちません、十徳ナイフは使ってこそ役に立つ訳です、例えば十徳ナイフの「栓抜き」(機能)を使うと言うのが「栓抜き」メソッド、「缶切」(機能)を使うと言うのが「缶切」メソッドに対応すると言うイメージです。 なるほどクラスがナイフの設計図で、constructor、newクラス名がナイフを作るための作業で、 ナイフがインスタンス化されたオブジェクトですが、この時点では何のメリットもないのですね。 インスタンス化されたオブジェクトを使う作業がメソッドという事ですね。 下記例ですとnew Cat("my cat");がナイフを具現化する作業(constructorもこれに当たる?)で、 実際に使うメソッドはここにはないのですかね? class Cat { (name) {this.name = name} meow() {alert( this.name + 'はミャオと鳴きました' )} } //インスタンス作成 var clsObj = new Cat("my cat"); //インスタンス(オブジェクト)の中身を出力 console.log(clsObj); >>> 仮引数とローカル変数(プロパティー)とは違います。 ローカル変数(プロパティー)はクラスの箱の中に定義されるモノです(添付画像参照)。 上記でも記載した、仮引数と実引数が実質var name = "my cat";というローカル関数と同じ結果になるという意味で書いたのですが、 それでも違うでしょうか? もちろん同じものではないですが、実質同じ結果にはなるのですよね。 >>> そして constructor(name) { var name = "my cat"; this.name = "my cat" } となりプロパティnameに文字列mycatが代入されるのですね。 下記が同じ結果になるという意味なのでしょうね。 >>> 申し訳ございません訂正です、引数を引数としか考えてませんでしたが、ローカルと言われれば確かに引数もローカル変数でした。 関数のローカル変数とインスタンスのプロパティーは類似していますが、インスタンスのプロパティーは値が保持されます。 ちなみに(コンストラクター以外は)クラスの構造がインスタンスの構造に反映されます(添付画像参照)。 関数のローカル変数とインスタンスのプロパティーは類似していますが、インスタンスのプロパティーは値が保持されます。 ここがよくわからないのですがconstructor(name)のnameは引数ではなくプロパティなのですか? 見た目は引数に見えますが、違いとしてはプロパティは値が入れられる箱であり、 仮引数はローカル変数名でしかなく、ローカル変数そのものではないので、箱ではなく、値を入れられないのですかね?

  • [JS]setTimeoutでクラス関数を使いたい

    他の処理を待ってから、別の処理を実施したい場合に、setTimeoutを使用するのが 一般的だと思いますが、特定のクラスの関数を実行する方法がよくわかりません。 グローバル変数を使用する場合には以下で動きます。 ※待機の部分は、問題を簡略化するため今回は3回実行完了まで、としています。 counter = 0; max = 3; method(); function method(){ if ( counter < max ) { timerId = setTimeout(method, 10 ); console.log(counter); counter++; } else { console.log("done"); } } 出力は以下のとおり。 0 1 2 done methodやcounter, maxなどを隠蔽するため、クラス関数を作り、以下のようにしました。 a = new test(); a.method(); function test(){ this.counter = 0; this.max = 3; this.method = function(){ if ( this.counter < this.max ) { timerId = setTimeout(this.method, 10 ); console.log(this.counter); this.counter++; } else { console.log("done"); } } } 出力は以下のようになってしまい、意図したように実行できていません。 0 done このような場合、どのようにしてクラス関数を再呼び出しするのでしょうか。

  • トリッキーなJSの文法(prototype.jsなど)が分かりません

    Ajaxの「prototype」( http://www.prototypejs.org/ )などで 下記のようなfunctionの記述方法をよく見かけます。 ▼Prototype.js(ver1.5.0) 20行目抜粋 ---------------------------------------- var Class = {  create: function() {   return function() {    this.initialize.apply(this, arguments);   }  } } -------------------------------------------- でも、私には高度すぎて以下の点がどうしても読み解けません。  (1)var Class = {~~~~~~} が、何をしているのか分かりません。    配列なら[ ]ですし関数か何かを省略した宣言の記述方法なのでしょうか?  (2)create: が何なのか分かりません。必死で調べたら型を宣言しているような感じでしたが、    見慣れない「:」を使ったプログラムで検討もつきません。 私が知っているfunction宣言はこの2パターンのみしか知りません。 ・一般的なfunction宣言  function test(hikisu){   //処理内容  } ・無名関数でのfunction宣言  var a = function(x) {   //処理内容  } ぜひ教えていただけませんでしょうか。 どうぞよろしくお願いします。

  • プロトタイプの関数から、別のプロトタイプの関数を呼出すには?

    javascript初心者ですが、オブジェクトに関してわからないことがあるので、教えてください。(とんちんかんな質問かもしれませんが、ご容赦下さい。) 下記のような場合、関数calから関数setを呼出すのはどうすればよいのでしょうか? function Obj(){ } Obj.prototype.set = function(){ } Obj.prototype.cal = function(){ ここから、setを呼出すにはどうすればよいのでしょうか? } var obj = new Obj();

  • クラスは関数の寄せ集め??

    クラスという概念がいまいちわかりません。 例えばMathクラスにはmax,sin,cos,tanなどの関数がありますが、 ようはクラスって関数(メソッド)を集めたものと思います。 そのような理解であっておりますでしょうか? であるならば、わざわざクラスに分類しなくても、関数(メソッド)で良い様に思うのです。 何でわざわざnew演算子を使ってオブジェクトを作成してからでないと 関数が使えないようにしたのか、さっぱりわかりません。 関数でいいじゃないですか。と思うのです。 「キミはsin()関数を作ってね、キミはcos()関数を作ってね。」 と 「キミはMathクラスのsinメソッドを作ってね、キミはMathクラスのcosメソッド作ってね」 では意味的にはたいして違わないと思うのです。 よろしくお願いします。

    • ベストアンサー
    • Java