blog

Object.create()、{} vs. new object()

I.: は Object の組み込みメソッドで、新しいオブジェクトを作成し、既存のオブジェクトを使用して新しく作成されたオブジェクトを提供します。...

Jul 23, 2020 · 3 min. read
シェア

I. Object.create()

Object.create():Objectの組み込みメソッドで、既存のオブジェクトを使用して新しいオブジェクトを作成します。

Object.create ( proto, [ propertiesObject ] ) 
  • proto: 新しいオブジェクトのプロトタイプとなるオブジェクトです。
  • propertiesObject : は、新しく作成されたオブジェクトのプロパティ名を持つオブジェクトです。引数 propertiesObject がNULL またはオブジェクトでない場合、エラーがスローされます!

実現。

//Object.create 基礎となる実装 Object.create = function(obj){ var Function = function(){}; Function.prototype = obj; return new Function(); } var parent = { name: "parent"; age: 50; } //-----child1 var child1 = Object.create(parent); //child1 は新しいオブジェクトである{},しかし、child1のプロトタイプ・オブジェクトは親である。 .nameは "parent "である // なぜならchild1はそのオブジェクトにname属性を持っていないので、プロトタイプオブジェクトでそれを探すからである。,child1 .__proto__.name親" の場合 //----child2 var child2 = Object.create(parent, {weight: 300}); // child2 = {weight: 300}; しかし、プロトタイプ・オブジェクトは親である.

つまり、nullが新しく生成されたオブジェクトのプロトタイプに設定されるため、当然、プロトタイプ・チェイン上の属性を持ちません。

使用シナリオ

  • クリーンなオブジェクトを作成したいプロパティが現在のオブジェクトのプロパティであるかどうかを判断するためにhasOwnPropertyを使用することを省略することは可能でしょう。

create(null)を使用するもう1つの理由は、for..inループを使用する際にオブジェクトのプロトタイプチェイン内のプロパティがトラバースされるため、create(null)を使用することでプロパティをチェックする必要がなくなることです。

II.

コンストラクタを使用して、ユーザー定義オブジェクト・タイプのインスタンスまたは組み込みオブジェクトのインスタンスを作成します。元のコンストラクタ・オブジェクトのプロパティは保持されます。

new constructor ( [aguments] )

コンストラクタ呼び出しパターンは、プロシージャを実行するために使用されます:

  1. 新しいオブジェクトを作成します;

  2. 新しいオブジェクトのプロトタイプをコンストラクタのプロトタイプにポイントします;

  3. コンストラクタのバインディングthis;を実行します。

  4. オブジェクトを返します。

    Function.method('new', function(){ // コンストラクタ関数のプロトタイプオブジェクトを継承した新しいオブジェクトを作成 var newObj= Object.create(this.prototype);

    // this を新しいオブジェクトにバインドしてコンストラクタ関数を呼び出します var result= this.apply(newObj, arguments); // this 以外の値を返す場合 var result= this.

    // 返り値がオブジェクトでない場合は、新しいオブジェクトを返します return newObj; }); // コンストラクタ関数を呼び出します。

注:Carオブジェクトのコンストラクタを呼び出し、呼び出しによってobjのthisをCarオブジェクトにバインドします。このステップでは、Carオブジェクトのプロパティをobjに継承します。

var Parent = function(name, age){
 this.name = name;
 this.age = age;
}
var Child = new Parent("child", "18");
Child._proto_ == Parent.prototype; //true 

III. {}: オブジェクトリテラルの作成

var obj = {name:"test", age:18};
obj.__proto__ == Object.prototype //true

IV: 違い

コンストラクタコンストラクタコンストラクタ
プロトタイプチェーンプロトコンストラクタのプロトタイプ属性コンストラクタ
動作対象機能

関数とオブジェクト

Read next

typeScriptのクラス (2)

オブジェクト指向です。そして、その中のクラスは、作成されたオブジェクトに共通するプロパティとメソッドを記述します。 従来のプログラムでは、再利用可能なコンポーネントを作成するために関数やプロトタイプベースの継承を使用しますが、オブジェクト指向のアプローチに慣れているプログラマにとっては、クラスベースの継承を使用し、オブジェクトはクラスから構築されるため、厄介な場合があります...

Jul 22, 2020 · 7 min read