ホームページ  >  記事  >  ウェブフロントエンド  >  Object.create と new: JavaScript の継承にどちらを使用するか?

Object.create と new: JavaScript の継承にどちらを使用するか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-15 12:06:03991ブラウズ

Object.create vs. new: When to Use Which for JavaScript Inheritance?

JavaScript の継承: Object.create と new

JavaScript では、さまざまなメソッドを通じて継承を実現できます。よく議論される 2 つのアプローチは、new キーワードと Object.create を使用することです。継承を検討するとき、利用可能なオプションの多さに気が遠くなることがあります。

JavaScript で継承を実現する最も一般的な方法を明確にするために、Object.create と new の違いを見てみましょう。

Object.create

Object.create は、別のオブジェクトを継承する新しいオブジェクトを作成するために使用されます。親オブジェクトのコンストラクター関数は呼び出されません。これは、親オブジェクトから特定のプロパティとメソッドを継承する新しいオブジェクトのみを作成する場合に便利です。

const baseModel = {
  property1: "value1",
  method1: function() {}
};

const newModel = Object.create(baseModel);

この例では、newModel は、baseModel から property1 とメソッド 1 を継承します。

new

new キーワードは、クラスまたはオブジェクトのコンストラクター関数を呼び出し、その新しいインスタンスを作成しますクラスまたはオブジェクト。コンストラクター関数を呼び出して、特定のプロパティとメソッドを使用して新しいオブジェクトを初期化します。

class BaseModel {
  constructor(property1) {
    this.property1 = property1;
  }

  method1() {}
}

const newModel = new BaseModel("value1");

この例では、newModel は、property1 が「value1」に初期化された BaseModel クラスのインスタンスです。

正しいアプローチの選択

Object.create の選択new は、プロパティとメソッドを継承する新しいオブジェクトを作成する必要があるか、親オブジェクトのコンストラクター関数を呼び出す必要があるかによって異なります。

  • 継承するオブジェクトのみを作成する場合は、Object.create を使用します。コンストラクターを呼び出さずに別のオブジェクトから呼び出します。
  • クラスまたはオブジェクトのインスタンスを作成し、そのインスタンスを呼び出す必要がある場合は、new を使用します。 constructor.

指定されたシナリオでは、RestModel または LocalStorageModel で拡張できる基本オブジェクト Model が必要になります。 Model の新しいインスタンスを作成してそのコンストラクターを呼び出す必要がないため、Object.create (またはその shim) を使用するのが正しい方法です。

RestModel.prototype = Object.create(Model.prototype);

RestModel で Model コンストラクターを呼び出したい場合は、代わりに call() または apply() を使用してください:

function RestModel() {
    Model.call(this); // apply Model's constructor on the new object
    ...
}

以上がObject.create と new: JavaScript の継承にどちらを使用するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。