Javascriptオブジェクト、プロトタイプ、プロトタイプチェーン-再温度

6292 ワード

Javascriptオブジェクト
Javacriptの対象はundfinedデータタイプ以外のすべての内蔵タイプの基本です.他のすべての内蔵タイプ(関数を含む)のソースは、オブジェクトにさかのぼります.どうやって追跡しますか?Object.prototype.isProttotypeOf(O)を使ってOのプロトタイプチェーンに対象プロトタイプObject.prototypeが含まれているかどうかを判断します.プロトタイプとプロトタイプチェーンは後の2つのセクションで説明します.ここのOは、明示的な宣言の対象である必要があります.すなわち、ある種類の宣言の直接量または構造関数を用いて宣言されます.下のコードセグメントの第1の第2のステートメントのように.このように彼らのプロトタイプチェーンにはObject.prototypeがデフォルトであります.宣言対象の方式は次の通りです.
//          :     
let objectCreatedInWayOne = {
    property1: '1',
    'property 2': '2' //    key         ,        ,            
};

let array1 = [];

//       :     new

let objectCreatedInWayTwo = new Object({
    propertyOne: '1',
    propertyTwo: '2'
});

let array2 = new Aarry();

//       :  create()            
let objectCreatedInWayThree = Object.create(Object.prototype, {
    propertyOne: '1',
    propertyTwo: '2'
});

let array3 = Object.create(Array.prototype, []);
オブジェクトの属性は、数値属性とアクセサ属性(ES 5の特性)の2種類に分類されます.数値属性は私たちが普段使っているものが多く、直接対象にkey:valueを定義します.アクセサ属性は複雑で、アクセサ属性は一対のgetterとsetter関数から構成されてもいいし、一つのgetter関数から構成されてもいいです.前者は読み/書きの属性で、後者は読みの属性です.アクセサ属性の定義と読み書きについては、下記のコードで示します.アクセサ関数では、オブジェクトの他の属性をthisキーワードで取得し、変更することができるのは、読み書きsizeの場合、オブジェクトがsizeのget\setメソッドを呼び出したときに、メソッド内にデフォルトの参加者が入ってきます.(この点は、Functionタイプの定義と呼び出しを参照することができる).
//    
let objectForDisplayProperties = {
    width: 10, //    
    length: 10, //    
    get size() { //      getter
        return this.width * this.height;
    },
    set size(size) { //      setter
        this.length = size / this.width;
    }//    ,size           。
}

//    ,              .     []
objectForDisplayProperties.size === 100;//true
objectForDisplayProperties['size'] = 50;
objectForDisplayProperties.length === 5;//true
オブジェクトの属性の読み書きと配置は、オブジェクトの拡張可能性と各属性の特性によって決定されます.ここでは、異なるタイプの属性の特性記述子が異なる.以下のコードセグメントには、width属性およびsizeを取得する特性記述子が示されている.数値属性とアクセサ属性は、いずれもenumerableとconfigrableの属性があると見られます.ここで、ディスクリプタオブジェクトのconfigrableは、この属性が設定されてもよいかどうかを表し、trueに設定すれば、その属性の特性記述子オブジェクト全体が変更され、数値属性からアクセサ属性に変更されても良い.ディスクリプタオブジェクトのenumerableは、この属性が列挙可能であるかどうかを表しています.列挙できるかどうかは、主にオブジェクトのための様々な方法で呼び出され、属性を区別します.具体的にはどのようにして次のコードを見ますか?一般に挙げられない属性はプロトタイプチェーンから継承された属性です.まとめてみます.この説明符の属性の大きな役割は、オブジェクトのプロトタイプチェーン上で継承される方法属性とオブジェクト自身が定義する属性エリアを分けることです.
//                   ,              。
//      width      
Object.getOwnPropertyDescriptor(objectForDisplayProperties, 'width');

    :
{
    value: 10, // 
    writable: true, //     ,   value
    enumerable: true, //     
    configurable: true //     
}

Object.getOwnPropertyDescriptor(objectForDisplayProperties, 'size');

    :
{
    get: f (), //getter  
    set: f (size), //setter  
    enumerable: true, //     
    configurable: true //     
}

//        。
for (property in objectForDisplayProperties) {
   //              ,       。
   if (objectForDisplayProperties.hasOwnProperty(property)) {
        //             
    }
}

objectForDisplayProperties.forEach(() => {
    //                
});

JSON.stringify(objectForDisplayProperties);//                   
//                                 。


//      
let objectTesting = {pro: 'test'};
Object.defineProperty(objectTesting , 'pro', {
    writable: false,
    configurable: false
});

objectTesting.pro= 'try modifying';
//    ,          。

Object.defineProperty(objectTesting , 'pro', {writable: true});
//    ,              。

//         ,      。
Object.preventExtensions(objectTesting);
objectTesting.newPro = 'try adding new pro';//    ,            
Object.isSealed(objectTesting);//true
//sealed                          ,   true。    Object.seal(object)    。
Object.isFrozen(objectTesting);//true
//frozen                  、            ,   true。    Object.freeze(object)    。
対象の属性分類を話し終わったら、対象の3つの内蔵の属性について説明する必要があります.関連するプロトタイプ、クラス名、および拡張可能性があります.拡張可能性は、このオブジェクトが属性を追加できるかどうかを示し、上記のコードセグメントの末尾に示すように動作します.クラス名は、対象がjavascriptでシステムから与えられた分類を表します.最後は原型の属性で、原型の属性もこれから重点的に話します.
 
原型
どのJavascriptオブジェクトも他のオブジェクトと関連しています.もう一つの対象は私たちがよく知っている原型です.各オブジェクトは原型から属性を継承します.継承された属性は、そのオブジェクトに内蔵されているプロトタイプのvalueにあります.ほとんどの場合、オブジェクトがプロトタイプから継承される属性は方法であり、ES 6のexted構文糖の実現はプロトタイプ継承を適用したと推定される.オブジェクトの直接量によって作成されたオブジェクトはすべて同じ原型を持っています.Object.prototype.キーワードnewとコンストラクタを呼び出して作成したオブジェクトのプロトタイプは、コンストラクタのプロトタイプ属性の値です.コードセグメントで示します.注意一般的には属性プロトタイプにアクセスすることで、あるオブジェクトのプロトタイプに直接アクセスすることはできません.Object.get ProttypeOf()がオススメです.実測:Chormeにおいて、対象の原型は__u uプロト.を選択します
let originalObject = {};
let createdObject = Object.create(originalObject, {});
//Object.getPrototypeOf(object)     object   
Object.getPrototypeOf(originalObject) === Object.prototype;//true
Object.getPrototypeOf(originalObject) === Object.prototype;//false,      originalObject,     

let array = new Array();
let symboledArray = [];

Object.getPrototypeOf(array) === Array.prototype;//true
Object.getPrototypeOf(symboledArray) === Array.prototype;//true
原型チェーン
冒頭で述べたように、オブジェクトはundfinedデータタイプ以外のすべての内蔵タイプの基礎であり、つまり内蔵タイプの原型チェーンにはObject.prototypeが多く含まれています.
原型チェーンとは何ですか?配列の種類で言ってください.配列タイプのコンストラクタには、配列タイプ自体がどのようなプロトタイプの方法を含むべきかが定義されています(一般的には方法です.例えば、concat:function()、slice:function()など)、そして配列タイプが定義上Objectタイプから継承されるため、配列タイプを定義するコンストラクターのプロトタイプには特殊な属性があります.記憶されているのは親級の原型です.こうして幾重にもネストされて一つの原型の鎖が形成された.各タイプのデータ構造関数のプロトタイプには、最上級の親レベルに到達するプロトタイプのリンクが含まれています.配列タイプが初期化されると、配列例はプロトタイプから属性を継承し、配列例のプロトタイプ属性(Chrome中の_proto_u u_)に配置され、配列例はプロトタイプチェーンを持っている.
let arrayTest= [];
Object.getPrototypeOf(Object.getPrototypeOf(arrayTest)) === Object.prototype;//true
//                     ,             
プロトタイプのチェーンがすごいようですが、何の効果がありますか?一つの大きな用途は、オブジェクト指向プログラミングを行い、一つのオブジェクトを定義するための一般的な行動(方法)です.
配列で言うと、配列のインスタンスオブジェクトの属性には、concat:function()、slice:function()などの配列を直接定義する方法がありません.これらの方法は配列のプロトタイプの属性において、配列に対してconcat属性を訪問したとき、解像器はまず配列の属性の中からkeyがconcatである属性を探しに行きます.見つけられなくなったらプロトタイプの鎖の中に入り、最下層から層ごとに検索します.幸いにも、私たちはプロトタイプチェーンの一番下の階にconcat属性を見つけて、concat方法を呼び出しました.もし私たちが訪問したのがtoString属性だったら?配列の原型にはこの属性がないことが分かります.寂しさに耐えてプロトタイプの鎖の上に登るしかないです.Objectという層のプロトタイプに登って、tostring属性を発見しました.toStringメソッドを呼び出しました.すると、自分をカンマで区切られた文字列に変えました.ここに言及して、あなたはすでに発見したかもしれません.プロトタイプチェーンは私達にjavascriptの中で対象に向かってプログラミングする中の継承と多状態を実現させます.