PoiemaWeb - Object


オブジェクト


1.対象とは?


JavaScriptのオブジェクトは、キーと値からなる属性の集合です.propertyの値として、JavaScriptで使用可能なすべての値を使用できます.JavaScriptの関数は1レベルのオブジェクトであり、値として扱うことができます.したがって、property値として関数を使用し、通常の関数と区別してメソッドと呼ぶことができます.
同様に、オブジェクトは、データを表すプロセスとデータ、および動作を表す方法からなる集合である.オブジェクトにはデータ(property)とデータに関連する動作(方法)が含まれるため、データと動作を1つのユニットに構造化することが非常に有用である.オブジェクト向けの継承を実現するために、JavaScript内のオブジェクトは、「プロトタイプ」と呼ばれるオブジェクトのプロトタイプとメソッドを継承できます.この原型は他の言語とは異なる重要な概念である.

1.1パーセント


propertyはpropertyキー(名前)とproperty値から構成されます.propertyはpropertyキーであり、唯一認識できます.すなわち、propertyキーはpropertyを識別するための識別子である.Propertyキーの命名規則と、Property値として使用できる値は以下のようになります.
設定キー:空の文字列を含むすべての文字列、Symbol値
他の値を使用すると、暗黙的なタイプ変換によって文字列に変換されます.
Property値:すべての値
既存のpropertyキーを繰り返し宣言すると、後で宣言されたpropertyが最初に宣言したpropertyが上書きされます.配列とは異なり、オブジェクトは構成をリストするときに順序を保証しません.

1.2方法


property値が関数である場合、通常の関数を区別する方法と呼ばれます.

2.オブジェクトの作成方法


Javaなどのクラスベースのオブジェクト言語は、クラスを事前に定義し、必要に応じてnew演算子を使用してインスタンスを作成することでオブジェクトを作成します.しかしjavascriptはプロトタイプベースのオブジェクト言語であり,クラスの概念がなく,独立したオブジェクト生成方法がある.
  • ECMAScript 6に新しいクラスが導入されました.
  • 2.1対象のフルネーム


    これは最も一般的なjavascriptオブジェクト生成方法です.クラスベースのオブジェクト向け言語に比べて、オブジェクトの作成は簡単です.{}に何も記述されていない場合は、空のオブジェクトが生成されます.

    2.2オブジェクトジェネレータ関数


    new演算子とオブジェクトジェネレータ関数を呼び出すことで、空のオブジェクトを作成できます.空のオブジェクトを作成するには、接尾辞またはメソッドを追加してオブジェクトを完了する方法です.
    コンストラクション関数とは、newキーワードとともにオブジェクトを作成および初期化する関数です.コンストラクション関数によって生成されるオブジェクトをインスタンスと呼びます.Objectジェネレータ関数のほか、JavaScriptにはString、Number、Boolean、Array、Date、RegExpなどのビルダー関数も用意されています.一般的な関数とコンストラクション関数を区別するために、コンストラクション関数の名前は通常パスカルボックス(Pascal case)を使用します.
    オブジェクトが所有していないPropertyキーに値を割り当てると、そのオブジェクトにPropertyが追加され、値が割り当てられます.既存のpropertyキーに新しい値を割り当てると、property値は割り当てられた値に変更されます.
    オブジェクト文字で作成されたオブジェクトは、最終的には、オブジェクトコンストラクション関数(Built-in)を使用してオブジェクトを作成する簡略表示(Short-hand)を簡略化します.すなわち、JavaScriptエンジンは、オブジェクト文字でオブジェクトを生成するコードに遭遇すると、内部でオブジェクトジェネレータ関数を使用してオブジェクトを生成します.したがって,開発者はオブジェクトジェネレータ関数を故意に使用してオブジェクトを作成する必要はほとんどない.

    2.3構造関数

  • コンストラクション関数名は、一般に大文字で始まる.これは構造関数であることを認識するのに役立ちます.
  • propertyまたはmethod名の前に説明したthisは、コンストラクション関数が作成するインスタンスを指します.
  • this(バインド)に接続するpropertyと方法はpublic(外部参照可能)です.
  • ジェネレータ関数で宣言される通常の変数はprivate(外部参照不可)です.すなわち,コンストラクション関数内部では自由にアクセスできるが,外部からはアクセスできない.
  • function Person(name, gender){
    	var married = true; //private
    	this.name = name; //public
    	this.gender = gender; //public
    	this.sayHello = function(){ //public
    		console.log('Hi my name is ' + this.name);
    	};
    }
    
    var person = new Person('Lee', 'male');
    console.log(typeof person); //Object
    console.log(person) // Person {name : "Lee", gender : "male", ...}
    console.log(person.married) //undefined
    JAvascriptのコンストラクション関数は、その名の通りオブジェクトを作成する関数です.ただし,Javaなどのクラスベース言語のコンストラクション関数とは異なる.既存の関数と同じ方法でコンストラクション関数を宣言し、new演算子を使用して呼び出すと、コンストラクション関数として動作します.
    これは、new演算子をコンストラクション関数ではなく一般関数に追加して呼び出すと、コンストラクション関数のように動作できることを意味します.したがって,コンストラクション関数名は大文字で最初の文字を記述し,混乱を防止するために努力する.

    3.オブジェクトプロファイルへのアクセス


    3.1 Property Key


    propertyキーとして使用できる値は、空の文字列を含むすべての文字列と、文字列に収束する式であってもよい.JavaScriptで使用可能な有効な名前でない場合は、引用符を使用する必要があります.

    3.2パーセント値の読み込み


    オブジェクトのproperty値にアクセスする方法には、句点マーキング法と角カッコマーキング法があります.

    3.3パーセント値の更新


    オブジェクトが所有するプロセスに新しい値を割り当てると、プロセス値が更新されます.

    3.4%動的作成


    オブジェクトが所有していないPropertyキーに値を指定すると、指定したPropertyが作成され、オブジェクトが追加されます.

    3.5%削除


    delete演算子を使用して、オブジェクトのpropertyを削除します.この場合、被演算子はpropertyキーでなければなりません.

    3.6 for-in


    for in文を使用すると、配列を含むオブジェクトに含まれるすべてのプロセスをループできます.
    var person = {
    	'first-name' : 'Ung-mo',
    	'last-name' : 'Lee',
    	gender : 'male'
    };
    for(var prop in person){ //prop에 객체 프로퍼티 이름이 반환된다. 단, 순서는 보장되지 않는다.
    	console.log(prop + ' : ' + person[prop]);
    }
    for in文は、オブジェクトをループする文字列キー(key)の構文です.並べるときは使わないほうがいいです.理由は以下の通り.
    24172フォントの場合、プロ選手の順番は保証されません.これは、元のオブジェクトのプロパティに順序がないためです.配列は順序を保証するデータ構造であるが,オブジェクトと同様に順序を保証しない.要素を配列するには、
  • のみを巡回します.
  • このようなfor-in文の欠点を克服するために、ECMAScript 6にはfor-of文が追加されている.
    const array = [1,2,3];
    array.name = 'my array';
    for(const value of array){
    	console.log(value);
    }
    /*
    1
    2
    3
    */
    for(const [index, value] of array.entries()){
    	console.log(index, value);
    }
    /*
    0 1
    1 2
    2 3
    */
    for in文はオブジェクトのpropertyを遍歴するために使用され、for of文は配列内の要素を遍歴するために使用されます.

    4. Pass-by-reference


    Object typeをオブジェクトタイプまたは参照タイプと呼びます.参照タイプは、オブジェクトのすべての演算が実際の値ではなく参照値と見なされることを意味します.元のタイプは、値が決定された後は変更できませんが、オブジェクトは構成を変更、追加、または削除できるため、変更可能(可変)値と呼ぶことができます.
    したがって、オブジェクトタイプは動的に変化し、どれだけのメモリ領域が必要か予測できないため、実行時にメモリ領域が保持され、メモリの「ヒープ領域」(Heap Segment)に格納されます.これに対して、元のタイプはpass-by-valueと呼ばれる値に渡されます.すなわち、pass-by-valueと呼ばれるコピーされ、渡されます.
    var foo = {
    	value : 10
    }
    var bar = foo;
    console.log(foo === bar); // true
    console.log(foo.value, bar.value); //10 10
    bar.value = 20;
    console.log(foo.value, bar.value); //20 20
    console.log(foo === bar); // true
    fooオブジェクトはオブジェクト文字で生成されます.このとき、変数fooは、オブジェクト自体ではなく、生成されたオブジェクトの参照値を格納する.変数barに変数fooの値を割り当てた.変数fooの値は、作成したオブジェクトの参照値を指すため、barにも参照値が格納される.すなわち,変数fooとbarは同じオブジェクトを参照する.オブジェクトは参照で渡されます.決してコピーされません.

    5.対象の分類


    オブジェクトは次のように分類できます.

    Built-in Object(内蔵オブジェクト)は、Webページなどを表示するための汎用機能を提供しています.Webページはブラウザにロードされると、直接使用でき、特別な動作はありません.Built-inオブジェクトは次のように分割できます.
  • 標準入力オブジェクト
  • BOM(Browser Object Model)
  • DOM(Document Object Model)
  • 標準コンストラクションオブジェクト(Standard Built-in Object)のほか、BOM、DOMをNative Objectに分類します.また,ユーザが作成したオブジェクトをHost Object(ユーザ定義のオブジェクト)と呼ぶ.
  • ホストオブジェクト(カスタムオブジェクト)
  • これらは、コンストラクション関数またはオブジェクトテキストによってオブジェクトを定義および拡張するため、Built-in ObjectおよびNative Object構成の後に構成されます.