

次のソースコードは何故、上手くいかないのでしょうか？  
■ソースコード■

[code]

    function Fn4(a, b) {
      this.a = a;
      this.b = b;
    }
    
    /* prototypeに引き込みたい関数オブジェクトproto_method */
    function proto_method() {
        console.log("proto method is called");
    }
    
    /* ■コンストラクター関数オブジェクトのインスタンス化■ */
    const fn4 = new Fn4();
    
    /* ★4.コンストラクター関数Fn4のインスタンスfn4のprototypeにメソッドdを設定★ */
    fn4.prototype.d = function() {
       console.log("method d is called");
    }
    
    console.log('-----★method execution trial 4★-----')
    fn4.d();
    
[/code]

例えば、最後に`console.log(fn4);`を行うと次のようにGoogle
Chromeの検証＞consoleにて、[[Prototype]]が存在しています。  
■結果■：`console.log(fn4);`  
[![画像の説明をここに入力](https://i.stack.imgur.com/9lvdK.jpg)](https://i.stack.imgur.com/9lvdK.jpg)

この件について、ChatGPT3.5で問い合わせたところ、次のような回答が得られています。

>
> 1.インスタンスに対してprototypeを使用してメソッドを設定する：fn4.prototype.dというコードでは、fn4はインスタンスであり、インスタンス自体にはprototypeプロパティが存在しません。正しい方法は、コンストラクター関数Fn4のプロトタイプに対してメソッドを設定することです。
>
>
> 2.メソッド呼び出しの誤り：fn4.d()というコードは、fn4はインスタンスであり、d()メソッドはプロトタイプに追加されているため、直接インスタンスから呼び出すことはできません。

追って質問：Google
ChromeのConsoleで確認すると、インスタンスにも[[Prototype]]という属性が出力されますが、「インスタンス自体にはprototypeプロパティが存在しません。」とはどういう意味ですか？

>
> 申し訳ありません、誤った情報を提供しました。インスタンスも実際にはプロトタイプを持ち、[[Prototype]]と呼ばれる内部プロパティでプロトタイプオブジェクトへのリンクを保持しています。したがって、インスタンス自体にはプロトタイプへのリンクが存在します。
>
>
> [[Prototype]]はJavaScriptの内部的なプロパティであり、通常のコードからは直接アクセスすることができません。しかし、いくつかの環境やツール（たとえば、Google
> ChromeのConsoleなど）では、[[Prototype]]を表示することができる場合があります。
>
>
> 正しい情報としては、インスタンスはプロトタイプを持ち、通常はプロトタイプチェーンを通じてそのプロトタイプのメソッドやプロパティにアクセスできます。インスタンスが直接prototypeプロパティを持っているわけではありませんが、[[Prototype]]を介してプロトタイプにアクセスできる仕組みです。

コンストラクター関数のprototypeを次のソースコードのように操作してメソッドを追加するスタンダードなやり方と同様に、インスタンスのprototypeは操作できないんですか？  
それは何故でしょうか？  
chatGPTの説明はどれ位合っていますか？

■ソースコード■

[code]

    function Fn1(a, b) {
      this.a = a;
      this.b = b;
    }
    
    /* ★1.コンストラクター関数Fn1のprototypeにメソッドcを設定★ */
    Fn1.prototype.c = function () {
      console.log("method c is called");
    };
    
    /* ■コンストラクター関数オブジェクトのインスタンス化■ */
    const fn1 = new Fn1();
    
    console.log('-----★method execution trial 1★-----')
    console.log('Fn1.prototype.c();')
    Fn1.prototype.c();
    console.log('fn1.c();')
    fn1.c();
    
[/code]

`console.log(fn1);`のGoogle Chromeの検証＞consoleでの結果は次の通りです。

■結果■：`console.log(fn1);`  
[![画像の説明をここに入力](https://i.stack.imgur.com/bXYkV.jpg)](https://i.stack.imgur.com/bXYkV.jpg)

また、次のやり方も出来ません。

■ソースコード■

[code]

    function Fn6(a, b) {
      this.a = a;
      this.b = b;
    }
    
    /* ■コンストラクター関数オブジェクトのインスタンス化■ */
    const fn6 = new Fn6();
    
    /* ★6.コンストラクター関数Fn6のインスタンスfn6のprototypeにコンストラクター関数Fn1のインスタンスfn1のprototypeを設定★ */
    Object.setPrototypeOf(fn6, fn1.prototype);
    
    console.log('-----★method execution trial 6★-----')
    fn6.c();
    
[/code]

こちらも、インスタンスのprototypeに対しての理解が成り立っていない為、起こるエラーと考えています。  
タイトルに戻りますが、インスタンスのprototypeの位置づけは以上についてどのようになっているのでしょうか？

よろしくお願い致します。


CC BY-SA 4.0
2023-08-09T07:17:58.000
95897
2023-08-09T08:10:01.317
2023-08-09T08:03:20.913
49404
49404
question
javascript
JavaScript文法 インスタンスに対するprototypeの位置づけ


だいたい ChatGPT の通りで、インスタンスから `prototype` というプロパティでプロトタイプにアクセスすることはできません。  
コンソールでは `[[Prototype]]` と表示されますが、`Object.getPrototypeOf(fn4)` や
`fn4.__proto__` でアクセスすることができます。


CC BY-SA 4.0
2023-08-09T08:10:01.317
95898
2023-08-09T08:10:01.317
3475
95897
answer