ホームページ ウェブフロントエンド jsチュートリアル JSオブジェクト指向基本解説(ファクトリーモード、コンストラクターモード、プロトタイプモード、ミックスモード、ダイナミックプロトタイプモード)_JavaScriptスキル

JSオブジェクト指向基本解説(ファクトリーモード、コンストラクターモード、プロトタイプモード、ミックスモード、ダイナミックプロトタイプモード)_JavaScriptスキル

May 16, 2016 pm 04:39 PM
オブジェクト指向

オブジェクト指向とは何ですか?オブジェクト指向は思想です! (ナンセンス)。

オブジェクト指向では、プログラム内の主要なモジュールをオブジェクトとみなすことができ、モジュールにはプロパティとメソッドがあります。このように、いくつかのプロパティとメソッドをカプセル化すると、将来使用するのに非常に便利になり、退屈で繰り返しの作業を避けることもできます。次にJSによるオブジェクト指向の実装について説明します。

工場出荷時モード

ファクトリ パターンは、ソフトウェア エンジニアリングの分野でよく知られた設計パターンです。ECMAScript ではクラスを作成できないため、関数のカプセル化を使用して特定のインターフェイスを持つオブジェクトを作成します。実装方法は非常に簡単で、関数内でオブジェクトを作成し、そのオブジェクトにプロパティやメソッドを代入し、そのオブジェクトを返すだけです。

function createBlog(name, url) {
  var o = new Object();
  o.name = name;
  o.url = url;
  o.sayUrl= function() {
    alert(this.url);
  }
  return o;
}

var blog1 = createBlog('wuyuchang', 'http://www.jb51.net/');
ログイン後にコピー

ファクトリ パターンの実装方法は非常に簡単で、類似したオブジェクトを複数作成する問題は解決されていることがわかります。ただし、ファクトリ パターンは、Date、Array、Date、Array とは異なり、すべてオブジェクトであるため、オブジェクトの種類を識別できません。など、Constructor パターンがあります。

コンストラクターパターン

ECMAScript のコンストラクターは、Array や Date などのネイティブ JS オブジェクトと同様に、特定の型のオブジェクトを作成できます。実装方法は以下の通りです:

function Blog(name, url) {
  this.name = name;
  this.url = url;
  this.alertUrl = function() {
    alert(this.url);
  }
}

var blog = new Blog('wuyuchang', 'http://www.jb51.net/');
console.log(blog instanceof Blog);  // true, 判断blog是否是Blog的实例,即解决了工厂模式中不能
ログイン後にコピー

この例と工場出荷時のモデルの関数名の違いを除けば、注意深いお子様であれば多くの違いに気づくはずです。

関数名の最初の文字は大文字にする必要があります (標準では最初の文字を大文字にすることは厳密に要求されていませんが、慣例により、コンストラクターの最初の文字は大文字にする必要があります
作成されたオブジェクトは表示されません
このオブジェクトにプロパティとメソッドを直接割り当てます
return ステートメントはありません
new を使用してオブジェクトを作成します
オブジェクトを認識できる (この点で、コンストラクター パターンがファクトリー パターンよりも優れています)

コンストラクターは使いやすいですが、欠点がないわけではありません。コンストラクターを使用する場合の最大の問題は、インスタンスが作成されるたびにメソッドを再作成する必要があることです (理論上、オブジェクトのプロパティは次のようになります)。オブジェクトのメソッドは同じですが、まったく同じメソッドを 2 回作成する必要はないので、関数をオブジェクトの外に移動することができます (おそらく、一部の子供たちはすでに欠点に気づいていますが、ブー!)。

function Blog(name, url) {
  this.name = name;
  this.url = url;
  this.alertUrl = alertUrl;
}

function alertUrl() {
  alert(this.url);
}

var blog = new Blog('scjb51', 'http://sc.jb51.net/'),
  blog2 = new Blog('jb51', 'http://www.jb51.net/');
blog.alertUrl();  // http://sc.jb51.net/
blog2.alertUrl();  // http://www.jb51.net/
ログイン後にコピー

blog と blog2 が同じ関数にアクセスできるように、alertUrl をグローバル関数として設定します。しかし、問題は、実際には Blog でのみ使用される関数を定義することになります。その名前にふさわしいものですが、さらに受け入れがたいのは、多くのメソッドが特定のオブジェクトによってのみ使用されるグローバル スコープで定義されていることです。スペースを無駄にすることは言うまでもなく、明らかにオブジェクト指向のカプセル化が失われるため、これはプロトタイプによって解決できます。 。 質問。

プロトタイプモード

作成するすべての関数には、オブジェクトへのポインターであるプロトタイプ属性があり、このオブジェクトの目的は、特定の型のすべてのインスタンスで共有できるプロパティとメソッドを含めることです。プロトタイプ オブジェクトを使用する利点は、すべてのオブジェクト インスタンスがそれに含まれるプロパティとメソッドを共有できることです。

function Blog() {
}

Blog.prototype.name = 'wuyuchang';
Blog.prototype.url = 'http://tools.jb51.net/';
Blog.prototype.friend = ['fr1', 'fr2', 'fr3', 'fr4'];
Blog.prototype.alertInfo = function() {
  alert(this.name + this.url + this.friend );
}

// 以下为测试代码
var blog = new Blog(),
  blog2 = new Blog();
blog.alertInfo();  // wuyuchanghttp://tools.jb51.net/fr1,fr2,fr3,fr4
blog2.alertInfo();  // wuyuchanghttp://tools.jb51.net/fr1,fr2,fr3,fr4

blog.name = 'wyc1';
blog.url = 'http://***.com';
blog.friend.pop();
blog2.name = 'wyc2';
blog2.url = 'http://+++.com';
blog.alertInfo();  // wyc1http://***.comfr1,fr2,fr3
blog2.alertInfo();  // wyc2http://+++.comfr1,fr2,fr3
ログイン後にコピー

プロトタイプ パターンには欠点がないわけではありません。まず、初期化パラメータを渡すためのコンストラクターが省略されているため、デフォルトではすべてのインスタンスが同じ属性値を取得します。これはまだプロトタイプではありません。プロトタイプ パターンの最大の問題は、共有の性質によって発生します。一方のインスタンスが参照を変更すると、もう一方のインスタンスも参照を変更します。したがって、通常はプロトタイプを単独で使用するのではなく、プロトタイプ パターンとコンストラクター パターンを組み合わせます。

混合モード(プロトタイプモード、コンストラクターモード)

function Blog(name, url, friend) {
  this.name = name;
  this.url = url;
  this.friend = friend;
}

Blog.prototype.alertInfo = function() {
  alert(this.name + this.url + this.friend);
}

var blog = new Blog('wuyuchang', 'http://tools.jb51.net/', ['fr1', 'fr2', 'fr3']),
  blog2 = new Blog('wyc', 'http://**.com', ['a', 'b']);

blog.friend.pop();
blog.alertInfo();  // wuyuchanghttp://tools.jb51.net/fr1,fr2
blog2.alertInfo();  // wychttp://**.coma,b
ログイン後にコピー

混合モードでは、コンストラクター モードはインスタンス プロパティの定義に使用され、プロトタイプ モードはメソッドと共有プロパティの定義に使用されます。各インスタンスは独自のインスタンス属性を持ちますが、同時にメソッドを共有し、メモリを最大限に節約します。さらに、このモードは初期パラメータの受け渡しもサポートしています。利点はたくさんあります。このモードは、ECMAScript でカスタム オブジェクトを作成する方法として最も広く使用され、認識されています。

ダイナミックプロトタイプモード

動的プロトタイプモードは、コンストラクター内にすべての情報をカプセル化し、コンストラクター内でプロトタイプを初期化することで(最初のオブジェクトのインスタンス化時にプロトタイプのみ初期化されます)、メソッドが有効。 。

function Blog(name, url) {
  this.name = name;
  this.url = url;

  if (typeof this.alertInfo != 'function') {
    // 这段代码只执行了一次
    alert('exe time');
    Blog.prototype.alertInfo = function() {
      alert(thia.name + this.url);
    }
  }
}

var blog = new Blog('wuyuchang', 'http://tools.jb51.net'),
  blog2 = new Blog('wyc', 'http:***.com');
ログイン後にコピー

上記の例では、ウィンドウが「実行時」に一度だけポップアップすることがわかります。これにより、blog2 はプロトタイプを初期化する必要がなくなりました。このモードを使用してオブジェクトを作成します。

このブログ投稿は、「JavaScript による高度なプログラミング 」の第 3 版を参照していますが、言語が簡略化され、例が書き直されています。理解できない点がある場合は、そのままにしておいてください。返信があれば著者がブログを更新します。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Go言語を使用してオブジェクト指向のイベント駆動型プログラミングを実装する方法 Go言語を使用してオブジェクト指向のイベント駆動型プログラミングを実装する方法 Jul 20, 2023 pm 10:36 PM

Go 言語を使用してオブジェクト指向イベント駆動プログラミングを実装する方法 はじめに: オブジェクト指向プログラミング パラダイムはソフトウェア開発で広く使用されており、イベント駆動プログラミングは、トリガーと処理を通じてプログラム フローを実現する一般的なプログラミング モデルです。イベント、コントロール。この記事では、Go 言語を使用してオブジェクト指向のイベント駆動型プログラミングを実装する方法とコード例を紹介します。 1. イベント駆動型プログラミングの概念 イベント駆動型プログラミングは、プログラムのフロー制御をイベントのトリガーと処理に移す、イベントとメッセージに基づくプログラミング モデルです。イベント駆動型で

Java で Jackson を使用する @JsonIdentityInfo アノテーションの重要性は何ですか? Java で Jackson を使用する @JsonIdentityInfo アノテーションの重要性は何ですか? Sep 23, 2023 am 09:37 AM

@JsonIdentityInfo アノテーションは、Jackson ライブラリ内でオブジェクトに親子関係がある場合に使用されます。 @JsonIdentityInfo アノテーションは、シリアル化および逆シリアル化中にオブジェクトの ID を示すために使用されます。 ObjectIdGenerators.PropertyGenerator は、使用されるオブジェクト識別子が POJO プロパティから取得される状況を表すために使用される抽象プレースホルダー クラスです。構文@Target(value={ANNOTATION_TYPE,TYPE,FIELD,METHOD,PARAMETER})@Retention(value=RUNTIME)public

Go でオブジェクト指向プログラミングを探索する Go でオブジェクト指向プログラミングを探索する Apr 04, 2024 am 10:39 AM

Go 言語は、型定義とメソッドの関連付けを通じてオブジェクト指向プログラミングをサポートします。従来の継承はサポートされていませんが、合成を通じて実装されます。インターフェイスは型間の一貫性を提供し、抽象メソッドを定義できるようにします。実際の事例では、顧客操作の作成、取得、更新、削除など、OOP を使用して顧客情報を管理する方法を示します。

PHP の高度な機能: オブジェクト指向プログラミングのベスト プラクティス PHP の高度な機能: オブジェクト指向プログラミングのベスト プラクティス Jun 05, 2024 pm 09:39 PM

PHP における OOP のベスト プラクティスには、命名規則、インターフェイスと抽象クラス、継承とポリモーフィズム、依存関係の注入が含まれます。実際のケースには、ウェアハウス モードを使用してデータを管理する場合や、ストラテジー モードを使用して並べ替えを実装する場合などがあります。

PHP オブジェクト指向プログラミングにおけるフライウェイト パターンの分析 PHP オブジェクト指向プログラミングにおけるフライウェイト パターンの分析 Aug 14, 2023 pm 05:25 PM

PHP オブジェクト指向プログラミングにおけるフライウェイト パターンの分析 オブジェクト指向プログラミングでは、デザイン パターンは一般的に使用されるソフトウェア設計手法であり、コードの可読性、保守性、スケーラビリティを向上させることができます。フライウェイト パターンは、オブジェクトを共有することでメモリのオーバーヘッドを削減する設計パターンの 1 つです。この記事では、PHP でフライウェイト モードを使用してプログラムのパフォーマンスを向上させる方法を説明します。フライ級モードとは何ですか?フライウェイト パターンは、異なるオブジェクト間で同じオブジェクトを共有することを目的とした構造設計パターンです。

Golang にはクラスのようなオブジェクト指向機能はありますか? Golang にはクラスのようなオブジェクト指向機能はありますか? Mar 19, 2024 pm 02:51 PM

Golang (Go 言語) には伝統的な意味でのクラスの概念はありませんが、構造体と呼ばれるデータ型が提供され、これによってクラスと同様のオブジェクト指向機能を実現できます。この記事では、構造体を使用してオブジェクト指向機能を実装する方法を説明し、具体的なコード例を示します。構造体の定義と使用法 まず、構造体の定義と使用法を見てみましょう。 Golang では、type キーワードを通じて構造を定義し、必要に応じて使用できます。構造には属性を含めることができます

Go言語のオブジェクト指向機能の分析 Go言語のオブジェクト指向機能の分析 Apr 04, 2024 am 11:18 AM

Go 言語は、オブジェクト指向プログラミング、構造体によるオブジェクトの定義、ポインター レシーバーを使用したメソッドの定義、インターフェイスによるポリモーフィズムの実装をサポートしています。オブジェクト指向の機能は、Go 言語でのコードの再利用、保守性、カプセル化を提供しますが、クラスや継承、メソッド シグネチャ キャストといった従来の概念が欠如しているなどの制限もあります。

C# 開発経験の共有: オブジェクト指向プログラミングと設計原則 C# 開発経験の共有: オブジェクト指向プログラミングと設計原則 Nov 22, 2023 am 08:18 AM

C# (CSharp) は、ソフトウェア開発の分野で広く使用されている強力で人気のあるオブジェクト指向プログラミング言語です。 C# 開発プロセスでは、オブジェクト指向プログラミング (OOP) の基本概念と設計原則を理解することが非常に重要です。オブジェクト指向プログラミングは、現実世界の物事をオブジェクトに抽象化し、オブジェクト間の対話を通じてシステム機能を実装するプログラミング パラダイムです。 C# では、クラスはオブジェクト指向プログラミングの基本的な構成要素であり、オブジェクトのプロパティと動作を定義するために使用されます。 C# を開発する場合、いくつかの重要な設計原則があります。

See all articles