プログラムのクセを探すのが好きな、ユゲタです。
先日、仕事でJavascriptをコーディングしていて、お決まりのようにnew宣言をしてインスタンスを利用していたときに、
何度も()を書くのが、もどかしく思ったので、リファレンスサイトを見てみると、newの時の()は、省略できるという事が書かれていました。
new 演算子 : MDN
new Foo は new Foo() と等価です。すなわち、引数を指定しない場合は Foo が引数なしで呼び出されます。
と、このように書かれているのですが、書き方によっては、正常に動作しない事を見つけてしまったので、ブログに書き残しておきたいと思います。
newの使い方いろいろ
Javascriptのガベージコレクションを理解してからは、メモリの扱いに優しいnew宣言でのインスタンスを使ったプログラムを基本の書き方にしています。
(function(){
function MAIN(){};
MAIN.prototype.test = function(a){
return "test-string : "+ a;
};
console.log(new MAIN().test("abcdefg"));
})();
// 実行すると下記がコンソールに表示される。
> test-string : abcdefg
かなり簡易に書きましたが、通常は、newインスタンスは、変数に格納して、使い回すのが一般的です。
let a = new MAIN();
console.log(a.test("1234567"));
> test-string : 1234567
なんてことはない、一般的なインスタンスの使い方ですが、
インスタンスを理解できていない人が読んでいることを想定して、丁寧に書いてみました。
()括弧の有り無しオブジェクション
次に、new宣言の()括弧をなくしてみると・・・
let a = new MAIN;
console.log(a.test("3.1415"));
> test-string : 3.1415
この場合は、()括弧が無くてもうまく動作します。
でも・・・次のように書くとどうでしょう?
console.log(new MAIN.test("+++++"));
> Uncaught TypeError: MAIN.test is not a constructor
> at <anonymous>:6:15
> at <anonymous>:7:3
「コンストラクターが無いよ!」と怒られてしまいました。
()括弧があれば、問題なく実行できるんですが・・・
new宣言をそのまま変数に格納せずに使用する場合は、()括弧が必至なんですね。
何故???という風に、腑に落ちないという人もいるかもしれませんが、
「これはコレ!!!」
と、覚えておきましょう。
クセを知らないのはバグの元
こうした、Javascriptに限らないのですが、言語特有のクセというのは、少なからずどんなプログラム言語でも存在します。
こういう細かなクセを身に着けていくことで、プログラムスキルって伸びていくわけですが、
独特なクセを知らないで使っていると、とんでもないバグを生み出すこともあるかもしれないので、
実際に、たくさんのコードを書いて実行して、体験する以外の、経験からのスキルアップでしか、得られないかもしれませんね。
とりあえず、他人のこうした失敗談などを目にすることでも、自分の経験として蓄積できるかもしれませんが、
そうした事を願って、ボクもブログに書き残していきたいと思います。
0 件のコメント:
コメントを投稿