JavaScriptの中の類と原型の理解

2307 ワード

JavaScriptでは、クラスのすべてのインスタンスオブジェクトが同じプロトタイプオブジェクトから属性を継承します.そのため、原型の対象はクラスの核心です.
例ではinheit()関数が定義されていますが、この関数は新しく作成されたオブジェクトを返します.後者はプロトタイプオブジェクトから継承されます.
プロトタイプのオブジェクトを定義し、inheit()関数によってそのオブジェクトから継承されるオブジェクトを作成すると、JavaScriptクラスが定義されます.
一般的に、クラスのインスタンスは、この新しいオブジェクトを作成し初期化するために、関数を定義することによって、さらに初期化する必要がある.
例としては、「値の範囲」を示すクラスに原型オブジェクトを定義し、「工場」関数を定義してクラスを作成し初期化する例があります.
//            proto       
//       ES5 Object.create()  
function inherit(proto) {
    if(proto == null) throw TypeError();    //proto     ,    null
    if(Object.create) return Object.create(proto); //  Object.create()  ,   
    var t = typeof proto; //       
    if(t!=='object' && t!=='function') throw TypeError();
    var f = function() {}; //          
    f.prototype = proto; //          proto
    return new f(); //   F()  proto     
}

// range.js:             
//             "    "
function range(from,to){
    //  inherit()       ,                 
    //               ,     "    "      
    var r=inherit(range.methods);
    //    "    "          
    //           ,            
    r.from=from;
    r.to=to;
    //          
    return r;
}

//        ,              
range.methods={
    //  x    ,   true;    false
    //            ,             
    includes:function(x){
        return this.from<=x && x<=this.to;
    },
    //               f
    //            
    foreach:function(f){
        for(var x=Math.ceil(this.from);x<=this.to;x++) f(x);
    },
    //            
    toString:function(){
        return "("+this.from+"..."+this.to+")";
    }
};

//     "    "     
var r=range(1,3);   //        
r.includes(2);      //=>true:2      
r.foreach(console.log); //=>  1 2 3
console.log(r);         //  (1...3)

以上のコードは、新しい範囲のオブジェクトを作成するための工場関数range()を定義しています.
レンゲ()関数に定義された属性レンゲ.methodsは、定義されたクラスの原型オブジェクトを迅速に保存するために使用されます.
ルージュ関数は、各範囲のオブジェクトにfromとto属性を定義し、範囲の開始位置と終了位置を定義するために使用されます.この2つの属性は非共有であり、もちろん継承できません.
最後に、レンゲ・methodsで定義されている共有可能・継承可能な方法は、fromとto属性を使用しており、また、thisキーワードを使用しており、これらを指すために、両者はthisキーワードを使用して、この方法を呼び出す対象を指す.然和類の方法はいずれもこのような基本的な用法によって対象の属性を読み取ることができる.
説明が必要なのは、「工場関数」によってクラスを定義するのはJavaScriptで定義されたクラスの一般的な方法ではなく、構造関数でクラスを定義することです.