JavaScriptの高度な(二)構造関数とプロトタイプ、継承、ES 5の新しい配列方法


JavaScriptプレミアム(二)
一、構造関数と原型
1、オブジェクトの三つの作成方法
//           
        function People(name, age, sex) {
     
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.say = function() {
     
                console.log('hello');
            }
        }
        var a = new People('  ', 13, ' ');
        console.log(a);
        //    
        var obj = {
     
            name: '  ',
            age: 12
        };
        // new Object()
        var obj2 = new Object();
        obj2.name = '  ';
        obj2['age'] = 12;
        console.log(obj2);

2、静的メンバーおよびインスタンスメンバー
  • 静的メンバー:コンストラクション関数に追加された属性またはメソッド、コンストラクション関数自体でのみアクセス可能な属性またはメソッド
  • インスタンスメンバー:インスタンスオブジェクトのみでアクセスできるプロパティまたはメソッド
  •   function People(uname, age, sex) {
         
                this.uname = uname;
                this.age = age;
                this.sex = sex;
                this.say = function() {
         
                    console.log('hello');
                }
            }
            var a = new People('  ', 13, ' ');
            // 1.     :                   
            console.log(a.uname);
            console.log(People.uname); //undefined ,   uname  People 
            // 2.     :             ,                     
            People.height = 'height';
            console.log(a.height); //undefined ,   height  a 
            console.log(People.height);
    

    3、構造関数モデル
  • コンストラクション関数にメソッドを直接追加する欠点オブジェクトを作成するたびに、メモリ領域を繰り返し開き、リソースを浪費する
  • .
  • コンストラクション関数のプロトタイプprototype各関数のデフォルトにはpropotype属性があり、その値のデフォルトはprototypeオブジェクト上のオブジェクトのメソッドと属性であり、newコンストラクション関数()によって作成されたインスタンスオブジェクトによって
  • が継承されます.
  • 注意:(1)関数であればprototype属性がデフォルトであるが、関数以外のオブジェクトが持たない(2)コンストラクション関数を定義する場合、共通のメソッドがプロトタイプオブジェクトに定義され、作成されたすべてのインスタンスによって
  • を直接継承することができる.
     function Student(uname, age) {
         
                this.uname = name;
                this.age = age;
            }
            //            propotype   ,           
            Student.prototype.sing = function() {
         
                console.log('    ');
            }
            Student.prototype.study = '  JS';
            var xm = new Student('  ', 15);
            //  prototype                    
            console.log(xm.study);
            xm.sing();
            var obj = {
         
                a: 1
            };
            // console.log(obj.prototype); //        
    

    4、対象モデル
         
                   __proto__   ,         ,                   
    
             
               __proto__         ,    __proto__
    
              
                      ,      __proto__           
    
    

    [外部リンク画像の転送に失敗しました.ソースステーションに盗難防止チェーンのメカニズムがある可能性があります.画像を保存して直接アップロードすることをお勧めします(img-O 6 w 9 IGIo-1614155392507)(E:黒馬トレーニングフロントエンド基礎ケーストレーニング就職クラスノートJS高級JS高級翌日imagesimg 4.png)]
    5、constructor構造関数
  • オブジェクトプロトタイプ(proto)とコンストラクション関数(prototype)プロトタイプオブジェクトには、コンストラクション関数自体を指すため、コンストラクション関数と呼ばれるプロパティconstructorプロパティがあります.
  • constructorは、主にオブジェクトがどのコンストラクション関数に参照されているかを記録するために使用され、プロトタイプオブジェクトを元のコンストラクション関数に再指向させることができる.
  • 元のprototypeを上書きするオブジェクトを再構築する場合、constuctorプロパティは
  • を手動で割り当てる必要があります.
     function Star(uname, age) {
         
         this.uname = uname;
         this.age = age;
     }
     //      ,         constructor               
     Star.prototype = {
         
     //               ,             ,        constructor         
       constructor: Star, //              
       sing: function() {
         
         console.log('    ');
       },
       movie: function() {
         
         console.log('     ');
       }
    }
    var zxy = new Star('   ', 19);
    console.log(zxy)
    

    6、原型チェーン
    各インスタンスオブジェクトには、もう1つの__があります.proto__属性は、コンストラクション関数のプロトタイプオブジェクトを指し、コンストラクション関数のプロトタイプオブジェクトもオブジェクトであり、_proto__プロパティは、このように1層1層上を探すとプロトタイプチェーンを形成します.
    [外部リンク画像の転送に失敗しました.ソースステーションに盗難防止チェーンがある可能性があります.画像を保存して直接アップロードすることをお勧めします(img-c 4 q 8 gDGJ-161455392508)(E:黒馬トレーニングフロントエンド基礎ケーストレーニング就職クラスノートJS高級JS高級翌日imagesimg 5.png)]
    プロトタイプチェーン理解(面接でよく聞く)
    各インスタンスオブジェクト(object)には、protoと呼ばれるプライベート属性があり、そのコンストラクション関数を作成するプロトタイプオブジェクト(prototype)を指します.このプロトタイプオブジェクトにも独自のプロトタイプオブジェクト(proto)があり、1つのオブジェクトのプロトタイプオブジェクトがnullになるまで階層的に上に移動します.
    7、プロトタイプチェーンとメンバーの検索メカニズム
    オブジェクトがプロパティにアクセスするときは、プロトタイプチェーンの順序に従います.
    (1)オブジェクトの属性にアクセスするときは,まずそのオブジェクト自身から検索する.
    (2)見つからない場合はプロトタイプオブジェクト(proto)から検索する
    (3)まだ見つかっていない場合は、最後尾のnullまでオブジェクトのプロトタイプチェーンに沿って上を検索し続けます.
    8.プロトタイプオブジェクトのthisの方向
    コンストラクション関数のthisとプロトタイプオブジェクトのthisは、newから出てきたインスタンスオブジェクトを指します.
    //     this  window
            //    this       
            var that;
            function Student(uname, age) {
         
                //      this           
                this.uname = name;
                this.age = age;
            }
            //            propotype   ,           
            Student.prototype.sing = function() {
         
                that = this;
                console.log('    ');
            }
            Student.prototype.sleep = function() {
         
                console.log(this === Student.prototype);
                console.log('   ');
            }
            var xm = new Student('  ', 15);
            xm.sing();
            console.log(that === xm);
    
            // sing  this     Student.prototype
            Student.prototype.sleep();
    

    9、プロトタイプチェーンの応用:内蔵オブジェクトのカスタム方法を広げる
    var arr = [1, 2, 3]
            console.log(arr.__proto__ === Array.prototype);
            arr.push(4);
    
            // 1.   :     Array       ,          
            Array.prototype.getSum = function() {
         
                console.log(this); //  arr=[1,2,3,4]
                var sum = 0;
                for (var i = 0; i < this.length; i++) {
         
                    sum += this[i];
                }
                return sum;
            }
            console.log(arr.getSum());
    

    プロトタイプオブジェクト上のメソッドを拡張する場合、元のプロトタイプオブジェクトを直接上書きすることはできません.メソッドの追加または変更のみ注意:組み込みオブジェクト(たとえば、Object、Array、Function)上のプロトタイプオブジェクトは上書きできません.変更のみ許可されます.
    二、継承
    1、call()
  • 使用:fn.call([thisArg, arg1, arg2…])
  • の役割:関数を呼び出し、呼び出し時のthisの値
  • を指定します.
  • パラメータ:thisArg関数のthisの指定値;arg 1,arg 2...オプションのパラメータリスト
  • 戻り値:関数呼び出しの結果
  • 注意:最初のパラメータthisArgがnull、undefinedを伝えない場合、デフォルトの関数内thisはwindow
  • を指します.
    2、サブコンストラクション関数親コンストラクション関数の属性を継承する
  • 親構造関数
  • を定義します.
  • サブコンストラクタ
  • を再定義する
  • サブコンストラクタ親コンストラクタのプロパティを継承(callメソッドを使用)
  • //            :    call()          this              this
            function People(name, age) {
         
                console.log(this); //this            
                this.name = name;
                this.age = age;
            }
    
            function Student(name, age) {
         
                // this           
                People.call(this, name, age);
            }
            var xm = new Student('  ', 15);
            console.log(xm);
    

    3、借用原型オブジェクトの継承方法
  • 親構造関数
  • を定義します.
  • サブコンストラクタ
  • を再定義する
  • サブコンストラクタ親コンストラクタのプロパティを継承(callメソッドを使用)
  •   //              :                ,                prototype
            function People(name, age) {
         
                console.log(this); //this            
                this.name = name;
                this.age = age;
            };
            People.prototype.say = function() {
         
                console.log('hello');
            };
    
            function Student(name, age, subject) {
         
                // this           
                People.call(this, name, age);
                this.subject = subject;
            };
            //             :
            // (1)               ,            ,     
            Student.prototype = People.prototype;
    
            // 2)              ,             
            var obj = {
         
                constructor: Student, // constructor       
                __proto__: People.prototype, //     ,              ;
            }
            Student.prototype = obj;
    
            // (3)          
            Student.prototype = new People();
            Student.prototype.constructor = Student;
    
            //                
            Student.prototype.sleep = function() {
         
                console.log('    ');
            }
            var xm = new Student('  ', 15, '  ');
            xm.say(); //xm               ;
            console.log(xm);
            console.log(People.prototype); //                     
            console.log(xm.constructor); //  xm       
    

    4、類の本質
  • コンストラクタのデフォルトには、オブジェクト
  • の値を持つprototypeプロパティがあります.
  • コンストラクション関数prototypeプロパティの下にconstructorとprotoの2つのデフォルトのプロパティ
  • があります.
  • 構造関数はprototypeにメソッドを追加することによって、すべてのインスタンス継承
  • を実現することができる.
  • コンストラクション関数によって作成されたインスタンス上_proto__コンストラクション関数を作成するprototype
  • classクラスの本質は実は改造版の構造関数
  • である.
    三、ES 5新規配列方法
    1、配列方法forEach遍歴配列
  • パラメータ:callback(要素、インデックス、配列自体)
  • 戻り値:
  • なし
  • 例:forEachを用いて配列和
  • を求める
     var arr = [10, 12, 55, 13]
    arr.forEach(function(item, index, arr) {
         
                console.log('   :' + index + '===>' + '    :' + item);
            })
    

    2、filter()メソッド配列から条件を満たすすべての要素をフィルタする
  • パラメータ:callback(要素、インデックス、配列自体)
  • 戻り値:新しい配列
  • 例:filterフィルタ配列内のすべての偶数
  • を使用する
      var arr2 = [1, 2, 3, 4, 5, 6];
     var newArr = arr2.filter(function(item,index) {
         
           //   return       ,        
    	return item % 2 == 0;
            })
            console.log(newArr);
    

    3、some()メソッド配列に条件を満たす要素があるかどうかを検索する
  • パラメータ:callback(要素、インデックス、配列自体)
  • 戻り値:true(見つかった)|false(見つからない)
  •  var arr = ['hello', '12', ' ', 'true', '']
           var a = arr.some(function(item, index){
         
                return item == '';
            })
            console.log(a);
    

    4、every()メソッド配列内のすべての要素が条件に合致しているかどうかを検索する
  • パラメータ:callback(要素、インデックス、配列自体)
  • 戻り値:true‖false(1つが満たされない限りfalseを返す)
  • var arr3 = [30, 22, 45, 16, 20];
            var b = arr3.every(function(item, index) {
         
                return item > 20;
            })
            console.log(b);
            //                Array.prototype;
            console.log(arr3.__proto__ === Array.prototype); //true
    

    5、trimメソッド文字列の両端のスペースを除去する
    var str = '   hello   '
    console.log(str.trim()//hello       
    var str1 = '   he l l o   '
    console.log(str.trim()//he l l o        
    

    6、オブジェクトの属性名を取得する
    Object.keys(オブジェクト)現在のオブジェクトに取得されたプロパティ名
  • 戻り値は、すべての属性名からなる配列
  • である.
      var obj = {
         
                a: 1,
                b: 2,
                c: 3
            };
            for (var key in obj) {
         
                console.log(obj[key]);
            }
            // 1.    Object.keys()              
            //    :          
            var res = Object.keys(obj);
            console.log(res);
    
            // 2.         
            res.forEach(function(item) {
         
                console.log(item); //       
                console.log(obj[item]); //         ,      ,  []
            })
    

    7、Object.defineProperty()メソッド
  • の役割:オブジェクトに新しい属性を定義するか、元の属性を変更し、オブジェクト
  • に戻る
  • 使用方法:Object.defineProperty(obj,prop,descriptor)(1)obj:属性を定義するオブジェクト(2)prop:定義または変更する属性の名前、文字列「name」(3)descriptor:定義または変更する属性記述子、データフォーマットはオブジェクト{}
  • 属性の記述子:(1)value:属性値(2)writable:変更可能かどうか(3)enumerable:列挙可能かどうか(4)configurable:属性を削除または再変更できるかどうか3つの属性記述子のデフォルトはfalse
  • です.
    var obj = {
         
                name: '  ',
                age: '12',
                gender: 'man'
            }
            Object.defineProperty(obj, 'height', {
         
                value: '170',
                writable: true, //      
                enumerable: true, //     
                configurable: true //      
            })
            obj.height = '175';
            console.log(Object.keys(obj));
            //       delete;
            delete obj.height;
            console.log(obj.height);