jsのオブジェクトプロトタイプ__proto__とコンストラクター属性

インスタンスオブジェクトのプロトタイプとは何ですか?

インスタンスオブジェクトのプロトタイプ:インスタンスオブジェクトには、コンストラクターのプロトタイプオブジェクトを指す属性__proto__があります。

  • インスタンスオブジェクト__proto__のプロトタイプとコンストラクターのプロトタイプは同等です。
  • メソッド検索ルール:まず、オブジェクトにメソッドがあるかどうかを確認します。ある場合は、オブジェクトに対してメソッドを実行します。そのようなメソッドがない場合は、__ proto__が存在するため、関数プロトタイプオブジェクトのコンストラクターに移動します。メソッドを見つけるためのプロトタイプ。
         function Star(name,sex){
    
    
            this.name=name;
            this.sex=sex;
            // this.sing=function(){
    
    
            //     console.log("我在唱歌");
            // }
        }
        Star.prototype.sing=function(){
    
    
            console.log("我在唱歌");
        }
        var ldh=new Star("小熊","男");
        var z=new Star("小明","男");
        console.log(ldh);
       console.log(ldh.__proto__===  Star.prototype);

ここに画像の説明を挿入
インスタンスオブジェクトのプロトタイプにもオブジェクトプロトタイプ__proto__があることがわかります。

オブジェクトプロトタイプとプロトタイプオブジェクトの比較も真の
ここに画像の説明を挿入
コンストラクタープロパティです

  • オブジェクトプロトタイプ(_ proto)とコンストラクター関数(prototype)プロトタイプオブジェクトにはプロパティコンストラクターがあります。コンストラクター自体を参照するため、コンストラクターをコンストラクターと呼びます。
  • コンストラクターは主に、オブジェクトが参照するコンストラクターを記録するために使用され、プロトタイプオブジェクトが元のコンストラクターを指すことを可能にします。
   function Star(name,sex){
    
    
            this.name=name;
            this.sex=sex;
            // this.sing=function(){
    
    
            //     console.log("我在唱歌");
            // }
        }
        Star.prototype.sing=function(){
    
    
            console.log("我在唱歌");
        }
        var ldh=new Star("小熊","男");
        var z=new Star("小明","男");
        console.log(ldh.__proto__.constructor);
        console.log(Star.prototype.constructor);

       console.log(ldh.__proto__.constructor ===  Star.prototype.constructor);

![ここに画像の説明を挿入](https://img-blog.csdnimg.cn/20210304155106334.png

指定されたコンストラクターが返されることがわかります

複数のプロトタイプオブジェクトメソッドがある場合はどうなりますか?このように書くことができます

   function Star(name,sex){
    
    
            this.name=name;
            this.sex=sex;
            // this.sing=function(){
    
    
            //     console.log("我在唱歌");
            // }
        }
        Star.prototype={
    
    
            sing:function(){
    
    
             console.log("我在唱歌");
            },
            study:function(){
    
    
                console.log("我在学习");
            }
        }
        var ldh=new Star("小熊","男");
        var z=new Star("小明","男");
        console.log(ldh.__proto__);
        console.log(Star.prototype);

ここに画像の説明を挿入
しかし、問題があります。コンストラクター属性はどこに行きますか?
コンストラクタープロパティは上書きされます。Star.prototype= {}がオブジェクトと等しい場合、上書きされます。

それを解決する方法は?
元のコンストラクターを指すには、コンストラクター属性を手動で使用する必要があります

   Star.prototype={
    
    
            constructor:Star,//指向原来的构造函数
            sing:function(){
    
    
             console.log("我在唱歌");
            },
            study:function(){
    
    
                console.log("我在学习");
            }
        }

ここに画像の説明を挿入
コンストラクタープロパティが出てきます

最後に、要約しましょう。

  • インスタンスオブジェクトのプロトタイプ(proto)とコンストラクターのプロトタイプオブジェクト(prototype)の両方に、プロパティコンストラクターがあります。コンストラクター自体を参照するため、コンストラクターをコンストラクターと呼びます。
  • 一般に、オブジェクトのメソッドはコンストラクターのプロトタイプオブジェクトに設定されます。複数のオブジェクトメソッドがある場合、オブジェクトの形式でプロトタイプオブジェクトに値を割り当てることができますが、これによりコンストラクタープロトタイプオブジェクトの元のコンテンツが上書きされるため、変更されたプロトタイプオブジェクトコンストラクターは現在のコンストラクターを指しなくなります。この時点で、元のコンストラクターを指すように、変更されたプロトタイプオブジェクトにコンストラクターを追加できます。

おすすめ

転載: blog.csdn.net/qq_41309350/article/details/114369253