目次
オブジェクト リテラル
ファクトリー関数
プロトタイプ チェーン
ES5 クラス
ES6 类
比较
性能
特点
结论
ホームページ ウェブフロントエンド jsチュートリアル JavaScript オブジェクトの作成パターンとベスト プラクティス

JavaScript オブジェクトの作成パターンとベスト プラクティス

Feb 23, 2017 pm 01:48 PM

JavaScript での「オブジェクトの作成」は複雑なトピックです。この言語にはオブジェクトを作成するためのさまざまな方法が用意されているため、初心者も経験豊富なユーザーもどれを選択すればよいか混乱するかもしれません。ただし、オブジェクトを作成する方法はたくさんあり、構文は非常に異なっているように見えますが、実際には思っているより似ている可能性があります。この記事では、オブジェクト作成メソッドを整理する旅にあなたを導き、さまざまなメソッド間の依存関係と漸進的な関係を明らかにします。

オブジェクト リテラル

最初の目標は、間違いなくオブジェクト、つまりオブジェクト リテラルを作成する最も簡単な方法です。 JavaScript は常に、クラスもテンプレートもプロトタイプも必要とせず、「何もない状態から」オブジェクトを作成できると説いており、メソッドとデータを備えたオブジェクトが「ポップ」で表示されます。

var o = {
  x: 42,
  y: 3.14,
  f: function() {},
  g: function() {}
};
ログイン後にコピー

しかし、この方法には欠点があります。同じタイプのオブジェクトを別の場所に作成したい場合は、このオブジェクトのメソッド、データ、初期化をコピーして貼り付ける必要があります。同じタイプのオブジェクトを 1 つだけではなくバッチで作成する方法が必要です。

ファクトリー関数

次の目的地はファクトリー関数です。明らかに、このメソッドを使用して、同じ構造、インターフェイス、実装を持つオブジェクトのクラスを作成するのが最も簡単です。オブジェクト リテラルを直接作成するのではなく、同じ型のオブジェクトを複数回または複数の場所に作成する必要がある場合は、この関数を呼び出すだけで済みます。

function thing() {
  return {
    x: 42,
    y: 3.14,
    f: function() {},
    g: function() {}
  };
}

var o = thing();
ログイン後にコピー

しかし、このアプローチには欠点もあります。各オブジェクトにはファクトリ関数の独立したコピーが含まれるため、メモリの肥大化が発生します。理論的には、すべてのオブジェクトがファクトリ関数のコピーを共有するようにします。

プロトタイプ チェーン

JavaScript は、プロトタイプ チェーンと呼ばれる、オブジェクト間でデータを共有するための組み込みメカニズムを提供します。オブジェクトのプロパティにアクセスすると、リクエストを完了するために他のオブジェクトに委任されます。これを使用してファクトリ関数を変更し、作成される各オブジェクトに独自の一意のデータのみが含まれるようにし、他のプロパティへのリクエストはすべてプロトタイプ チェーン上の共通オブジェクトに委任できます。

var thingPrototype = {
  f: function() {},
  g: function() {}
};

function thing() {
  var o = Object.create(thingPrototype);

  o.x = 42;
  o.y = 3.14;

  return o;
}

var o = thing();
ログイン後にコピー

実際、JavaScript 自体には、この一般的なパターンをサポートするメカニズムが組み込まれています。この共有オブジェクト (プロトタイプ オブジェクト) を自分で作成する必要はありません。JavaScript によって関数ごとにプロトタイプ オブジェクトが自動的に作成され、このオブジェクトに共有データを直接配置できます。

thing.prototype.f = function() {};
thing.prototype.g = function() {};

function thing() {
  var o = Object.create(thing.prototype);

  o.x = 42;
  o.y = 3.14;

  return o;
}

var o = thing();
ログイン後にコピー

しかし、この方法には欠点もあります。それは重複が発生するということです。上記の Thing 関数の最初と最後の行は、すべての「デリゲート プロトタイプのファクトリ関数」で、ほとんど違いなく繰り返されます。

ES5 クラス

これらの繰り返しコードを抽出してカスタム関数に入れることができます。この関数はオブジェクトを作成し、他の任意の関数 (パラメータ関数) のプロトタイプと委任 (継承) 関係を確立します。次に、新しく作成したオブジェクトをパラメータとして使用し、この関数 (パラメータ関数) を呼び出し、最後にこれを返します。新しいオブジェクト。

function create(fn) {
  var o = Object.create(fn.prototype);

  fn.call(o);

  return o;
}

// ...

Thing.prototype.f = function() {};
Thing.prototype.g = function() {};

function Thing() {
  this.x = 42;
  this.y = 3.14;
}

var o = create(Thing);
ログイン後にコピー

実際、JavaScript にもこのメソッドのサポートが組み込まれています。私たちが定義した create 関数は、実際には new キーワードの基本的な実装であるため、create を new に簡単に置き換えることができます。

rreee

私たちが到着した駅は、ES5クラスと呼ばれることが多いです。関数を通じてオブジェクトを作成し、共有する必要があるデータをプロトタイプ オブジェクトに委任し、new キーワードを使用して繰り返しロジックを処理します。

しかし、この方法には欠点もあります。冗長で見苦しく、継承を実装するとさらに冗長で見苦しくなります。

ES6 类

JavaScript最新的相关改进是ES6 类,用新语法来实现上述功能要简洁得多。

class Thing {
  constructor() {
    this.x = 42;
    this.y = 3.14;
  }

  f() {}
  g() {}
}

var o = new Thing();
ログイン後にコピー

比较

多年以来,JavaScript开发者们与原型链的关系总是若即若离,纠缠不清。而今天我们最有可能遇到的两种创建对象的方式,一种是强烈依赖原型链的class语法,另一种则是完全不依赖原型链的工厂函数语法。这两种方式在性能上和特点上是不一样的——尽管差别不太大。

性能

今天的JavaScript引擎已经经过了大幅度的优化,以至于很难通过JavaScript代码来推断怎样会比较快。关键在于测量方法。然而测量方法有时也会失灵。通常每六周就会有更新的JavaScript引擎发布,而在这之前采取的测量方法,和基于这种测量方法做出的决策都有可能失去意义。因此,我的经验法则是选择最官方、最广泛使用的语法,因为大多数时候它经历的实践检验最多,因而性能是最高的。目前来说class语法最符合这一点,在我写这篇文章时,class语法大约比返回字面量的工厂函数快3倍。

特点

随着ES6的发布,类与工厂函数之间曾经存在的几点差异消失了。现在,工厂函数和类都能够强制实现真正的私有数据——工厂函数通过闭包实现,类通过WeakMap实现。两者都能实现多重继承——工厂函数可以将其他属性混入自己的对象,类也可以将其他属性混入自己的原型,或者通过类工厂,通过代理也能实现。工厂函数和类也都可以在需要的时候返回任意对象,语法也都很简单。

结论

综合考虑,我更倾向于class语法。它标准、简单、干净、快速,还提供了所有曾经只有函数工厂才具备的特点。

 以上就是JavaScript 创建对象模式与最佳实践的内容,更多相关内容请关注PHP中文网(www.php.cn)! 


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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP で文字列を浮動小数点数に変換するためのベスト プラクティス PHP で文字列を浮動小数点数に変換するためのベスト プラクティス Mar 28, 2024 am 08:18 AM

PHP で文字列を浮動小数点数に変換することは、開発プロセス中の一般的な要件です。たとえば、データベースから読み取られた金額フィールドは文字列型であり、数値計算のために浮動小数点数に変換する必要があります。この記事では、PHP で文字列を浮動小数点数に変換するためのベスト プラクティスを紹介し、具体的なコード例を示します。まず最初に、PHP で文字列を浮動小数点数に変換するには、(float) 型変換を使用するか、(floatval) 関数を使用するという 2 つの主な方法があることを明確にする必要があります。以下ではこの2つを紹介していきます

Golang での文字列連結のベスト プラクティスは何ですか? Golang での文字列連結のベスト プラクティスは何ですか? Mar 14, 2024 am 08:39 AM

Golang での文字列連結のベスト プラクティスは何ですか? Golang では、文字列の連結は一般的な操作ですが、効率とパフォーマンスを考慮する必要があります。多数の文字列連結を処理する場合、適切な方法を選択すると、プログラムのパフォーマンスが大幅に向上します。以下では、Golang での文字列連結のベスト プラクティスを具体的なコード例とともにいくつか紹介します。 strings パッケージの Join 関数の使用 Golang では、strings パッケージの Join 関数を使用することが効率的な文字列結合方法です。

golang フレームワークのベスト プラクティスは何ですか? golang フレームワークのベスト プラクティスは何ですか? Jun 01, 2024 am 10:30 AM

Go フレームワークを使用する場合のベスト プラクティスは次のとおりです。 Jin や Echo などの軽量フレームワークを選択します。 RESTful 原則に従い、標準の HTTP 動詞と形式を使用します。ミドルウェアを活用して、認証やロギングなどのタスクを簡素化します。エラーの種類と意味のあるメッセージを使用して、エラーを正しく処理します。単体テストと統合テストを作成して、アプリケーションが適切に機能していることを確認します。

Go でのインデントのベスト プラクティスを調べる Go でのインデントのベスト プラクティスを調べる Mar 21, 2024 pm 06:48 PM

Go 言語では、適切なインデントがコードの読みやすさの鍵となります。コードを記述するとき、インデント スタイルを統一すると、コードがより明確になり、理解しやすくなります。この記事では、Go 言語でのインデントのベスト プラクティスを探り、具体的なコード例を示します。タブの代わりにスペースを使用する Go では、インデントにタブの代わりにスペースを使用することをお勧めします。これにより、異なるエディターでのタブ幅の不一致によって引き起こされる組版の問題を回避できます。インデントのスペース数: Go 言語では、インデントのスペース数として 4 つのスペースを使用することを公式に推奨しています。これにより、コードを次のようにすることができます

徹底した比較: Java フレームワークと他の言語フレームワークのベスト プラクティス 徹底した比較: Java フレームワークと他の言語フレームワークのベスト プラクティス Jun 04, 2024 pm 07:51 PM

Java フレームワークは、クロスプラットフォーム、安定性、スケーラビリティが重要なプロジェクトに適しています。 Java プロジェクトの場合、Spring Framework は依存関係の注入とアスペクト指向プログラミングに使用され、ベスト プラクティスには SpringBean と SpringBeanFactory の使用が含まれます。 Hibernate はオブジェクト リレーショナル マッピングに使用され、複雑なクエリには HQL を使用するのがベスト プラクティスです。 JakartaEE はエンタープライズ アプリケーション開発に使用され、ベスト プラクティスは分散ビジネス ロジックに EJB を使用することです。

PHP ベスト プラクティス: Goto ステートメントを回避する代替案の検討 PHP ベスト プラクティス: Goto ステートメントを回避する代替案の検討 Mar 28, 2024 pm 04:57 PM

PHP のベスト プラクティス: Goto ステートメントを回避する代替案の検討 PHP プログラミングにおいて、goto ステートメントは、プログラム内の別の場所への直接ジャンプを可能にする制御構造です。 goto ステートメントはコード構造とフロー制御を簡素化できますが、コードの混乱、可読性の低下、デバッグの困難を招きやすいため、その使用は悪い習慣であると広く考えられています。実際の開発では、goto ステートメントの使用を避けるために、同じ機能を実現する別の方法を見つける必要があります。この記事では、いくつかの代替案を検討します。

Laravel開発における.envファイルの役割とベストプラクティス Laravel開発における.envファイルの役割とベストプラクティス Mar 10, 2024 pm 03:03 PM

Laravel 開発における .env ファイルの役割とベストプラクティス Laravel アプリケーション開発では、.env ファイルは最も重要なファイルの 1 つとみなされます。これには、データベース接続情報、アプリケーション環境、アプリケーション キーなど、いくつかの主要な構成情報が含まれます。この記事では、具体的なコード例とともに、.env ファイルの役割とベスト プラクティスについて詳しく説明します。 1. .env ファイルの役割 まず、.env ファイルの役割を理解する必要があります。 Laravel では、

Git またはバージョン管理? PHP プロジェクト管理の主な違い Git またはバージョン管理? PHP プロジェクト管理の主な違い Mar 10, 2024 pm 01:04 PM

バージョン管理: 基本的なバージョン管理は、チームがコード ベースの変更を追跡できるようにするソフトウェア開発手法です。これは、プロジェクト ファイルのすべての履歴バージョンを含む中央リポジトリを提供します。これにより、開発者はバグを簡単にロールバックしたり、バージョン間の差異を確認したり、コード ベースに対する同時変更を調整したりすることができます。 Git: 分散バージョン管理システム Git は分散バージョン管理システム (DVCS) であり、各開発者のコ​​ンピュータにはコード ベース全体の完全なコピーが存在します。これにより、中央サーバーへの依存がなくなり、チームの柔軟性とコラボレーションが向上します。 Git を使用すると、開発者はブランチの作成と管理、コード ベースの履歴の追跡、他の開発者との変更の共有が可能になります。 Git とバージョン管理: 分散型とセット型の主な違い

See all articles