classのインスタンスは関数の呼び出しと同じなのでしょうか
いいえ、全く違います
JavaScript
1class Animal {
2 // コンストラクタを追加してください
3 constructor(){
4 console.log("インスタンスを生成しました");
5 }
6}
7
8console.log(new Animal()); // Animal {}
9console.log(Animal()); // Uncaught TypeError: Class constructor Animal cannot be invoked without 'new'
解説しておくと、ES5まではclass構文というものはなく、
コンストラクタメソッド的な挙動をする関数を用意していました。
JavaScript
1const Animal2 = function (name) {
2 this.name = name;
3}
4Animal2.prototype.say = function () {
5 console.log(`${this.name}: meou`);
6}
7
8console.log(new Animal2('tama')); // Animal2 {name: "tama"}
9console.log(Animal2('tama')); // undefined
10
11(new Animal2('tama')).say(); // "tama: meou"
Animal2('tama')
の結果がundefined
になるのは見れば誰でも分かります。
何もreturn
してないですからね。
new Animal2('tama')
はインスタンス名付きのオブジェクトですね。
これはまず空のオブジェクト生成し、thisに生成したばかりのオブジェクトを設定して関数を実行。
関数の中身ではthis.name
等に値を詰め込むような挙動を行いました(この辺は実際にコードを書いて制御します)
そして関数実行後にthisを戻すのがnew 関数()
の挙動になります。
まさにインスタンスの生成の為だけに作られた特殊な関数で、
JavaScriptがプロトタイプベースと呼ばれる所以でもあります。
メソッドはプロトタイプメソッドで定義します。
関数の呼び出しのようなことをしているのでしょうか。
普通の関数呼び出しと挙動は違い、
かなり特殊ではあるのですが、関数呼び出しではあります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/09/23 10:57