JSとJavaでは、インスタンスの考え方が異なるのでしょうか?
本質的には変わりはないと考える方が適切と思います。
javaではsというデータの中に、インスタンスが格納され
自分は「sは変数名、sという変数が保持している値がインスタンスの参照=インスタンスのアドレス」と捉えてます。
JSでは、console.log(obj instanceof test)から、objがインスタンスとされていて
自分は「objは変数名、objという変数が保持している値がインスタンスの参照=インスタンスのアドレス」と捉えています。
前回の質問からjavaではsというデータの中に、インスタンスが格納され、具体的にコードでインスタンスを見ることができませんでした。しかし、JSでは、console.log(obj instanceof test)から、objがインスタンスとされていて、コードで見ることができます。
どちらの言語も同じだと思います。JavaでもtoString
メソッドを適切にオーバーライドすればSystem.out.println(s)
でsが指しているインスタンスに関する情報が表示できますよ?
JavaScriptも仕組み(インスタンスがどのように表示されるか)はJavaとは違いますが、「変数に対してメソッドを起動したり属性をアクセスしたり」といったことは「インスタンスを保持している変数を介して行う」という点ではJavaもJavaScriptも本質的に変わらないと思っています。
蛇足?:
自分は「JavaもJavaScriptもPythonもRubyもLispもその他もろもろの多くの言語で同じ」だと思っています。変数が特定のインスタンス(の値そのもの、またはアドレス)を保持していて変数を介してインスタンスを操作するという考え方は共通ではないですか?変数は変数です。変数のことをインスタンスと思ったらなんか変に思えます。
JavaScript
1let a = new Date();
2let b = a;
3a = 1;
a
が「Dateのインスタンス」だと考えてしまうと後からaに1
というインスタンスが格納される上のようなコードをスッキリ説明できなくなる気がします。aに1を代入しても元代入されていたDateのインスタンスはaという変数とは独立にちゃんとどこかに存在していると考えた方が自然に思えます。(本ケースではbに同じインスタンスを設定してますが例えbに設定してなかろうがDateのインスタンスは(ガベージコレクターが後から消すまでは)ちゃんとどこかに存在していると考えた方が自然ではないでしょうか?
前回の質問で自分が「y_waiwaiさんの回答(※)を支持した」のは上記のような考えからです。
※:y_waiwaiさんの回答の引用
sはインスタンスを指している変数です。
インスタンス(実体)ってのはメモリの何処かに存在していて、sを通してそのインスタンスを操作します
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。