「JavaScriptモード」読書ノート(3)—字面量と構造関数1

10561 ワード

新しいページが始まりました.この章からすべての内容は非常に価値と意義があります.この章の主な内容は対象字面量、構造関数、配列字面量、正則字面量、基本値タイプ字面量及びJSONなどです.皆さんの仕事と実用にも一定の指導的意義があります.
 
一、対象文字数
直接コードを見に来ました.
//           
var dog = {};

//  dog        
dog.name = "Benji";

//   , dog        
dog.getName = function() {
    return dog.name;
};

//       ,dog          ,      (                 ,        )。
//                    。            ,         。

//
dog.getName = function() {
    //          
    //          
    return "Fido";
};

//       /  :
delete dog.name;

//
dog.say = function () {
    return "Woof!";
};

dog.fleas = true;
もちろん、空のオブジェクトから開始する必要はありません.オブジェクトの字面量パターンは、オブジェクトを作成する際に関数を追加できます.
var dog = {
    name:"Benji",
    getName:function() {
        return this.name;
    }
};
ok,上の例は標準的な対象の字面量の書き方です.対象の字面量の文法は以下の通りです.
1、対象を括弧で包装します.
2、オブジェクト内のコンマ区切りの属性と方法.最後の名前-値の末尾にコンマが許されますが、いくつかの特殊なブラウザで誤報がありますので、なるべくやめてください.
3、属性の名前と属性の値をコロンで区切ります.
4、変数に値を割り当てるときは、右括弧「%」の後の分数を忘れないでください.
 
コンストラクタからのオブジェクト
まず、どのようにオブジェクトを作成しますか?
//      :     :
var car = {goes:'far'};

//      :        -       ,    !
var car = new Object();
car.goes = "far";
上の2つのオブジェクトを作成する方法です.特に、オブジェクトを作成するために、内蔵構造関数を使用しないでください.文字の量が顕著な利点は、より短い文字を入力するだけであることです.字面量パターンの作成対象を優先的に選択する別の理由は、オブジェクトから抽出された属性または方法ではなく、オブジェクトの可変ハッシュマッピングだけであることを強調することである.
objectのコンストラクタを使用しているのに対し、字面量を使用しているもう一つの理由は、ドメイン解析が機能していないことにある.同じ名前で局所構造関数を作成することができるので、解凍器はオブジェクトから抽出された属性や方法ではなく、Object()を呼び出した位置からアクティブドメインチェーンを常に上部に照会する必要がある.
 
オブジェクト構造関数の捕捉
オブジェクトのコンストラクタを使ってオブジェクトを作成することはできませんが、オブジェクトのコンストラクタの「特徴」を知るべきです.ここで関連する「特徴」は、Object()構造関数が一つのパラメータしか受け入れられず、転送の値にも依存していることであり、このObject()は、他の内蔵構造関数を委任してオブジェクトを作成し、望まれていない別のオブジェクトを返している可能性がある.
//       

//      
var o = new Object();
console.log(o.constructor === Object); //true

//       
var o = new Object(1);
console.log(o.constructor === Number); //true
console.log(o.toFixed(2)); //"1.00"

//        
var o = new Object('I am a String');
console.log(o.constructor === String);// true

//         substring()  
//             
console.log(typeof o.substring); // "function"

//       
var o = new Object(true);
console.log(o.constructor === Boolean); //true
上のコードを見て、数字、文字列、ブール値をnew Object()構造関数に伝達し、その結果、異なる構造関数で作成されたオブジェクトが得られた.最後のBooleanオブジェクトを作成すると、実際には、作成された内蔵構造関数を実行するのはObject()ではなく、Object()がBoolean()構造関数を委任して作成したのです.
Object()に伝達されるコンストラクタの値は動的であり,そのタイプが実行時に決定されるまでは,Object()コンストラクタのこの挙動は予期せぬ結果をもたらす可能性がある.最後にもう一度強調します.new Object()構造関数を使わないでください.
 
二、カスタムコンストラクタ
オブジェクトの字面量パターンと内蔵のコンストラクタ以外に、オブジェクトを作成するために自分のコンストラクターを使用できます.
var adam = new Person("Adam");
adam.say();
ここのPersonはただの関数です.
var Person = function(name) {
    this.name = name;
    this.say = function () {
        return "I am" + this.name;
    };
};
newオペレータを使ってコンストラクタを呼び出すと、関数の内部に次のような状況が発生します.
1、空のオブジェクトを作成し、このオブジェクトを参照しながら、関数のプロトタイプを継承します.
2、属性と方法は、this参照の対象に追加されます.
3、新しく作成したオブジェクトはthisによって参照され、最後に暗黙的にthisに戻ります.表示されていない場合は他のオブジェクトに戻ります.
このように見えます.
var Person = function(name) {
    //                 
    // var this = {};
    //  this       
    this.name = name;
    this.say = function () {
        return "I am" + this.name;
    };

    // return this;
};
上記の例では、簡単にするために、say()方法をthisに追加した.その結果、いつでもnew Person()を呼び出すとメモリに新しい関数が作成されます.この方法の効率は明らかに非常に低い.なぜなら、複数のインスタンス間のsay()方法は実際には変化していないので、より良い選択は、Personクラスのプロトタイプに方法を追加することである.
Person.prototype.say = function () {
    return "I am" + this.name
}
ここで強調したいことは、重用できるメンバー、例えば重用できる方法は、オブジェクトの原型に置くべきです.
注意:
// var this = {};
このコードは真実のすべてではない.「空」の対象は実際には空ではないので、Personの原型から多くのメンバーが引き継がれました.したがって、以下のような言葉があります.
//var this = Object.create(Person.prototype);
Object.createは今後の内容でさらに検討します.
 
コンストラクタの戻り値
newオペレータを使用してオブジェクトを作成すると、コンストラクタは常にオブジェクトに戻ります.デフォルトでは、thisが参照するオブジェクトを返します.コンストラクタにthisに属性を追加しないと、空のオブジェクトに戻ります.
コンストラクタは陰的にthisを返します.また、関数にリアルなreturn文が追加されていません.ただし、必要に応じて他のオブジェクトを返すことができます.たとえば:
var Objectmaker = function () {
    //    “name”      
    //                    
    this.name = "This is it";
    //           
    var that = {};
    that.name = "And that's that";
    return that;
}
//   
var o = new Objectmaker();
console.log(o.name);
上に見たように、どのオブジェクトでも构造関数で自由に戻ります.オブジェクトではない値を返します.これはエラーを引き起こすことはありませんが、関数は単純に値を無視します.逆に、構造関数はthisによって参照されたオブジェクトを返します.
 
はい、今日の内容はここまでにします.後は続けて、文章の内容が長すぎるのを防ぐ.