JavaScript:The Good Parts(三)

7892 ワード

第3章対象(Object)
3.1対象字面量(Object Literals)
3.2検索(Retrieval)
3.3更新(udate)
3.4引用(Reference)
3.5原型(Prottype)
3.6反射(Reflection)
3.7列挙(Enumeration)
3.8削除(Delete)
3.9グローバル変数の汚染を減らす(Global Abatement)
JSの単純なタイプは、数字、文字列、ブール値、null値、undefined値を含みます.他のすべての値は対象です.数値、文字列、ブール値の「似ている」オブジェクトは、方法がありますが、それらは可変ではありません.
JSのオブジェクトは可変のキーセットです.JSでは、行列はオブジェクト、関数はオブジェクト、正規表現はオブジェクトです.もちろん、オブジェクトはオブジェクトです.オブジェクトは属性のコンテナで、属性ごとに名前と値があります.属性の名前は空の文字列を含む任意の文字列とすることができ、属性値はundefined値以外の任意の値とすることができます.
JSの対象は無分類です.オブジェクトはデータの収集と管理に適しています.オブジェクトは他のオブジェクトを含むことができますので、ツリーまたはグラフィック構造として容易に表現できます.JSは他のオブジェクトの属性を継承するためのプロトタイプチェーン特性を含みます.これを正しく使うと、オブジェクト初期化の時間とメモリの消費を減らすことができます.
3.1対象字面量(Object Literals)
(1)オブジェクトの字面量は、新規オブジェクト値を作成するために非常に便利な表示法を提供しています.一つの対象の字面の量はペアの括弧の中で0または複数の「名/値」ペアを囲むことです.
var empty_object= {};

var stooge= {
    "first-name":"Jerome",
    "last-name":"Howard"
};
(2)属性名は、空の文字列を含む任意の文字列を含むことができます.オブジェクトの文面量において、属性名が合法的なJS識別子であって、かつ、予約ワードではなく、属性名を「」で囲むことは強制的に要求されない.したがって、引用符で「first-name」を囲む必要がありますが、first_には含まれていません.nameはオプションです.コンマは、複数の「名前/値」のペアを区切るために使用されます.
属性の値は、他のオブジェクトの字面量を含む任意の表現から得られます.オブジェクトはネストできます.
var flight={
    airline:"Oceanic",
    number:815,
    departure: {
        IATA:"SYD",  //IATA:        
        time:"2004-09-22 14:55",
        city:"Sydney"
    },
    arrival: {
        IATA:"LAX",
        time:"2004-09-23 10:42",
        city:"Los Angeles"
    }
};
3.2検索(Retrieval)
(1)検索対象に含まれる値は、()サフィックスに文字列表式を含める方法で使用できます.文字列表式が定数であり、合法的なJS識別子である場合には.表現法を用いてもよい.使用を優先する.表示法.
    stooge["first-name"]  //"Jerome"
    flight.depature.IATA  //"SYD"
(2)存在しないメンバー要素の値を検索してみると、undefinedに戻ります.
    stooge["middle-name"]  //undefined
    flight.status  //undefined,status:  ,    
    stooge["FIRST-NAME"]  //undefined
(3)124 124は標準値を満たすために使用できます.
    var middle= stooge["middle-name"]||"(none)";
    var status= flight.status||"unknow";
(4)undefined値を検索するとTypeErrエラーが発生します.&演算子でエラーを回避できます.
    flight.equipment     //undefined,equipment:  ,   
    flight.equipment.model    //TypeError
    flight.equipment&&flight.equipment.model    //undefined
3.3更新(udate)
オブジェクトの値は、割り当てられた語句によって更新されます.
(1)属性名がオブジェクトに存在する場合、この属性の値が置換されます.
    stooge["first-name"]= "Joe";
(2)属性名が存在しない場合は、この属性はオブジェクトに拡張されます.
    stooge["middle-name"]= "Lester";
    stooge.nickname= "Curly";
    flight.equipment={
        model:"Boeing 747" 
    };
    flight.status= "overdue";    //overdue:  
3.4引用(Reference)
オブジェクトは参照によって伝達され、それらは永遠にコピーされない.
var x= stooge;
x.nickname= 'Curly';
var nick= stooge.nickname;    //  x stooge           ,  nick 'Curly'
var a= {},b= {},c= {};    //a、b c             
var a= b= c= {};    //a、b c         
3.5原型(Prottype)
(1)各オブジェクトは一つのプロトタイプオブジェクトに接続され、その中から属性を継承することができます.オブジェクトの字面量で作成したオブジェクトはすべてObject.prototypeというJS標準オブジェクトに接続されています.
(2)新しいオブジェクトを作成すると、その原型としてオブジェクトを選択できます.Objectにbeget法を追加し,この方法は元のオブジェクト(流入したオブジェクトパラメータ)をそのプロトタイプとして用いる新しいオブジェクトを作成する.

if(typeof Object.beget!== 'function'){
    Object.beget= function(o){
        var F= function(){};
        F.prototype= o;
        return new F();
    };
}
var another_stooge= Object.beget(stooge);    //   stooge         another_stooge
(3)原型接続は更新時には機能しません.(自分のオブジェクトだけを更新しても、そのオブジェクトの原型オブジェクトは更新されません.)あるオブジェクトを変更した場合、そのオブジェクトの原型には触れません.
    another_stooge['first-name']= 'Harry';
    another_stooge.nickname= 'Moe';
    alert(another_stooge['first-name']+stooge['first-name']+another_stooge.nickname+stooge.nickname);    //'HarryJoeMoeCurly'
(4)原型接続は検索値の時にのみ使用されます.オブジェクトの属性値を取得してみて、そのオブジェクトに属性名がない場合、JSはプロトタイプオブジェクトから属性値を取得してみます.もしそのプロトタイプのオブジェクトがこの属性を持っていないなら、プロトタイプから探して、このように類推して、その過程が最後に終点Object.prototypeに達するまでです.欲しい属性が完全にプロトタイプチェーンに存在しないなら、結果はundefinedです.この過程が依頼となります.
原型関係は動的な関係です.新しい属性をプロトタイプに追加すると、この属性はすぐにプロトタイプに基づいて作成されたすべてのオブジェクトに見えます.
var stooge.profession= 'actor';
another_stooge.profession    //'actor'
3.6反射(Reflection)
(1)対象を確認し、対象の属性がどのようなものかを確認することは容易であり、その属性を検索して取得した値を検証してみる限りである.typeofオペレータは、属性の種類を決定するのに役立ちます.
typeof flight.number    //'number'
typeof flight.status    //'string'
typeof flight.arrival    //'object'
typeof flight.manifest    //undefined
(2)プロトタイプチェーンのいずれの属性も値を生成します.
typeof flight.toString    //'function'
typeof flight.constructor    //'function'
(3)これらの不必要な属性を扱う二つの方法がある.
最初はあなたのプログラムをチェックして関数値を削除します.一般的には反射の目的はデータですので、いくつかの値が関数であることを認識すべきです.
もう一つの方法はhasOwnProperty方法を使用して、対象が独自の属性を持つとtrueに戻ります.ハスOwnProperty方法はプロトタイプチェーンを検査しません.
flight.hasOwnProperty('number')    //true
flight.hasOwnProperty('constructor')    //false
3.7列挙(Enumeration)
(1)for in(javaでfor eachという)
for in文は、オブジェクト内のすべての属性名を巡回するために使用されます.このリストには、関数とあなたが関心を持っていないかもしれないプロトタイプの属性が含まれています.だから、あなたが望まない値をフィルタする必要があります.最も一般的なフィルタは、hasOwnProperty方法と、typeofオペレータが関数を排除します.
var name;
for(name in another-stooge){
    if(typeof another_stooge[name] !== 'function'){
        document.writeln(name + ':' +another_stooge[name]);
    }
}
(2)一般for
for in属性名の出現順序は不確定ですので、可能な順序を用意します.属性を特定の順序で確保するには、for in文を完全に使用しないで、配列を作成し、常に正しい順序で属性名を含めます.
var i;
var properties=[
    'first-name',
    'middle-name',
    'last-name',
    'profession'
];
var length=properties.length;
for(i=0;i<length;i +=1 ){
    document.writeln(properties[i] + ':' +another_stooge[properties[i]]);
}
3.8削除(Delete)
delete演算子は、オブジェクトの属性を削除するために使用できます.オブジェクトの中に含まれている属性を決定します.プロトタイプチェーンのオブジェクトには触れません.
オブジェクトの属性を削除すると、プロトタイプチェーンから属性が浮かび上がります.
another_stooge.nickname     //'Moe'
delete another_stooge.nickname;    //  another_stooge.nickname  ,        nickname  
another_stooge.nickname    //'Curly' 
3.9グローバル変数の汚染を減らす(Global Abatement)
JSは、アプリケーションのすべてを保存できるグローバル変数を任意に定義することができます.残念なことに、グローバル変数はプログラムの柔軟性を弱めます.
(どう理解しますか?後ろの赤い部分)ですので、避けなければなりません.
グローバル変数を最小化する方法は、あなたのアプリケーションで唯一のグローバル変数を作成することです.
var MYAPP= {};  
この時はあなたのアプリケーションのコンテナに変わりました.
MYAPP.stooge= {
    "first-name":"Joe",
    "last-name":"Howard"
}; 
MYAPP.flight={
    airline:"Oceanic",
    number:815,
    departure: {
        IATA:"SYD",
        time:"2004-09-22 14:55",
        city:"Sydney"
    },
    arrival: {
        IATA:"LAX",
        time:"2004-09-23 10:42",
        city:"LAS Angeles"
    }
};
複数のグローバル変数を一つの名前空間に整理するだけで、他のアプリケーション、構成、またはクラスライブラリとの間に悪影響を及ぼす可能性が著しく低下します.あなたのプログラムも読みやすくなります.明らかにMYAPP.stoogeはトップ構造を指しています.