jsパッケージ

5227 ワード

Javascriptは対象(object-based)に基づく言語で、あなたが出会うすべてのものはほとんど対象です.しかし、それは本物のオブジェクト向けプログラミング(OOP)言語ではないです.その文法にはクラスがないからです.
インスタンスオブジェクトの元のパターンを生成します.
猫を対象とすると、名前と色の2つの属性があります.
var Cat = {
  name : '',
  color : ''
}
今はこのプロトタイプオブジェクトの仕様に基づいて、二つのインスタンスオブジェクトを生成する必要があります.
var cat1 = {}; //        
cat1.name = "  "; //            
cat1.color = "  ";
var cat2 = {};
cat2.name = "  ";
cat2.color = "  ";
これは一番簡単なパッケージです.二つの属性を一つのオブジェクトに入れます.しかし、このような書き方には二つの欠点があります.
オリジナルモードを改良
コード重複の問題を解決する関数を書くことができます.
function Cat(name,color) {
 return {
   name:name,
   color:color
  }
}
次にインスタンスオブジェクトを生成すると、関数を呼び出しているのと同じです.
var cat1 = Cat("  ","  ");
var cat2 = Cat("  ","  ");
この方法の問題は依然として、cat 1とcat 2の間に内在的な連絡がなく、それらが同じプロトタイプのオブジェクトである例を反映することができない.
コンストラクタモード
プロトタイプオブジェクトからインスタンスを生成する問題を解決するために、Javascriptはコンストラクションモードを提供する.「コンストラクタ」とは、一般的な関数であるが、内部では , ; , , 。 thisを使用して、コンストラクタに の演算子を使用すると、インスタンスが生成され、new変数がインスタンスオブジェクトに結合される.例えば、猫の原型の対象は現在このように書くことができます.
function Cat(name,color){
  this.name=name;
  this.color=color;
}
私たちは今すぐにインスタンスオブジェクトを生成できます.
var cat1 = new Cat("  ","  ");
var cat2 = new Cat("  ","  ");
alert(cat1.name); //   
alert(cat1.color); //   
このとき、cat 1およびcat 2は、自動的にthis属性を含み、それらの構造関数を指す.
alert(cat1.constructor == Cat); //true
alert(cat2.constructor == Cat); //true
Javascriptはまた、モデルオブジェクトとインスタンスオブジェクトとの関係を検証するconstructor演算子を提供する.
alert(cat1 instanceof Cat); //true
alert(cat2 instanceof Cat); //true
コンストラクタモードの問題
コンストラクター法は使いやすいですが、メモリを浪費する問題があります.見てください.今はCatの対象に不変の属性typeを追加して、もう一つの方法を追加します.モデル対象のCatは次のようになります.
function Cat(name,color){
  this.name = name;
  this.color = color;
  this.type = "    ";
  this.eat = function(){alert("   ");};
}
それとも同じ方法を採用して、インスタンスを生成しますか?
var cat1 = new Cat("  ","  ");
var cat2 = new Cat ("  ","  ");
alert(cat1.type); //     
cat1.eat(); //    
表面的には問題がないようですが、実際にこのようにすると、大きな弊害があります.それは、各インスタンスオブジェクトに対して、instanceof属性とtype方法は同じ内容であり、各インスタンスを生成するたびに、重複したコンテンツのためにメモリを多く占用しなければならない.これは環境にもやさしいし、効率にも欠ける.
alert(cat1.eat == cat2.eat); //false
問題:eat()属性とtype方法をメモリに一度だけ生成して、そのメモリアドレスをすべて指してもいいですか?答えは大丈夫です.
Prottypeモード
Javascriptは、各構造関数にはeat()属性があり、他のオブジェクトを指すと規定しています.このオブジェクトのすべての属性と方法は、構造関数の例によって継承されます.
これは、私達がこれらの不変の属性と方法を直接prototypeオブジェクトに定義することができるという意味です.
function Cat(name,color){
  this.name = name;
  this.color = color;
}
Cat.prototype.type = "    ";
Cat.prototype.eat = function(){alert("   ")};
その後、インスタンスを生成する.
var cat1 = new Cat("  ","  ");
var cat2 = new Cat("  ","  ");
alert(cat1.type); //     
cat1.eat(); //    
この場合、全例のprototype属性およびtype方法は、同じメモリアドレスであり、eat()オブジェクトを指すので、動作効率が向上する.
alert(cat1.eat == cat2.eat); //true
Prottypeモードの検証方法
プロトタイプの属性に合わせるために、Javascriptはいくつかの補助方法を定義しています.それを使うのを手伝ってくれます.
1、isPrototypeOf()
この方法は、あるproptotypeオブジェクトとあるインスタンスとの関係を判断するために用いられます.
alert(Cat.prototype.isPrototypeOf(cat1)); //true
alert(Cat.prototype.isPrototypeOf(cat2)); //true
2、ハスOwnProperty()
各インスタンスオブジェクトには、ある属性がローカル属性であるか、それともprototypeオブジェクトから属性を継承するかを判断するためのhasOwnProperty()方法がある.
alert(cat1.hasOwnProperty("name")); // true
alert(cat1.hasOwnProperty("type")); // false
3、in演算子prototype演算子は、ローカル属性でないにかかわらず、あるインスタンスに属性があるかどうかを判断するために使用されてもよい.
alert("name" in cat1); // true
alert("type" in cat1); // true
in演算子は、あるオブジェクトのすべての属性を巡回するためにも使用されます.
for(var prop in cat1) {     
    alert("cat1["+prop+"]="+cat1[prop]); 
}
jsクラスでは、2つの方法と属性のアクセス権限が提供されています.
  • 公開レベル:クラス内でも外でもアクセスできます.
  • プライベートレベル:クラス内でアクセスできますが、クラス外ではできません.
  • function Person(name,age,sal){
        this.name=name;//     
        var age=age;//     
        var sal=sal;//     
        //           (    ),    (    )
      //                       
        this.show=function(){
            window.alert(age+" "+sal );
        }
    //    ,         
        function show2(){
            window.alert(age+sal);
        }
    }
    var p1=new Person("sp",30,4000);
    p1.show();//      
    //               
    p1.show2();//               ;     !           
    
    コード解析:1、varを使ってプライベート属性を定義します.つまり、関数の中の局所変数です.ローカル変数の作用領域は関数です.関数の外では取得できません.2、プライベート属性は外部では操作できませんが.しかし、関数内部の開示方法は動作可能である.3、コードp 1.show 2()実行時;間違いを報告しますオブジェクトはこの属性または方法4をサポートしていません.プライベート属性を操作するには、クラス内の公開方法でプライベート属性を操作できます.そして私たちはまた公開方法を操作します.in 転載:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapulation.