検索
ホームページウェブフロントエンドjsチュートリアルJavaScriptのデザインパターン(カプセル化)_JavaScriptスキルを学ぶ

JavaScript では、抽象クラスとインターフェイスはサポートされていません。 JavaScript 自体も弱い型付け言語です。 JavaScript には、型をカプセル化する機能がありませんし、それ以上のことを行う必要もありません。 JavaScript でデザインパターンを実装する場合、型を区別しないことは不名誉とも言えますし、救いとも言えます。

デザインパターンの観点から見ると、パッケージングは​​より重要なレベルでパッケージングの変更に反映されます。

変更をカプセル化することにより、システムの進化中に、システムの安定した部分と変更されやすい部分が分離されます。これらの部分がカプセル化されている場合は、それらの部分を置き換えるだけで済みます。はい、交換は比較的簡単です。これにより、プログラムの安定性と拡張性を最大限に確保できます。

JavaScript カプセル化には 3 つの基本モードがあります:

1. 合意優先の原則を使用し、すべてのプライベート変数は _

で始まります。
 <script type="text/javascript">
  /**
   * 使用约定优先的原则,把所有的私有变量都使用_开头
   */
  var Person = function (no, name, age)
  {
   this.setNo(no);
   this.setName(name);
   this.setAge(age);
  }
  Person.prototype = {
   constructor: Person,
   checkNo: function (no)
   {
    if (!no.constructor == "string" || no.length != 4)
     throw new Error("学号必须为4位");
   },
   setNo: function (no)
   {
    this.checkNo(no);
    this._no = no;
   }, 
   getNo: function ()
   {
    return this._no;
   setName: function (name)
   {
    this._name = name;
   }, 
   getName: function ()
   {
    return this._name;
   }, 
   setAge: function (age)
   {
    this._age = age;
   }, 
   getAge: function ()
   {
    return this._age;
   }, 
   toString: function ()
   {
    return "no = " + this._no + " , name = " + this._name + " , age = " + this._age;
   }
  };
  var p1 = new Person("0001", "小平果", "22");
  console.log(p1.toString());  //no = 0001 , name = 小平果 , age = 22
  p1.setNo("0003");
  console.log(p1.toString());  //no = 0003 , name = 小平果 , age = 22
  p1.no = "0004";
  p1._no = "0004";
  console.log(p1.toString()); //no = 0004 , name =小平果 , age = 22

 </script>

コードを読んだ後、_ で始まる変数をすべて入れても、そのままアクセスできます。これはカプセル化と言えますか?が優先されます。

このアンダースコアの使用はよく知られた命名規則であり、プロパティがオブジェクトの内部使用のみを目的としており、プロパティにアクセスしたり直接設定したりすると、予期しない結果が生じる可能性があることを示します。これにより、プログラマが誤って使用することを防ぐことができますが、意図的に使用することは防止できません。

このメソッドは、少なくともメンバー変数の getter メソッドと setter メソッドがオブジェクト内ではなくプロトタイプ内にあるため、全体的には良い選択です。これは不可能であり、カプセル化を厳密に実装する必要があると思われる場合は、2 番目の方法を検討してください。

2. カプセル化を厳密に実装する

<script type="text/javascript">
  /**
   * 使用这种方式虽然可以严格实现封装,但是带来的问题是get和set方法都不能存储在prototype中,都是存储在对象中的
   * 这样无形中就增加了开销
   */
  var Person = function (no, name, age)
  {
   var _no , _name, _age ;
   var checkNo = function (no)
   {
    if (!no.constructor == "string" || no.length != 4)
     throw new Error("学号必须为4位");
   };
   this.setNo = function (no)
   {
    checkNo(no);
    _no = no;
   };
   this.getNo = function ()
   {
    return _no;
   }
   this.setName = function (name)
   {
    _name = name;
   }

   this.getName = function ()
   {
    return _name;
   }

   this.setAge = function (age)
   {
    _age = age;
   }
   this.
     getAge = function ()
   {
    return _age;
   }

   this.setNo(no);
   this.setName(name);
   this.setAge(age);
  }
  Person.prototype = {
   constructor: Person,
   toString: function ()
   {
    return "no = " + this.getNo() + " , name = " + this.getName() + " , age = " + this.getAge();
   }
  }
  ;
  var p1 = new Person("0001", "小平果", "22");
  console.log(p1.toString());  //no = 0001 , name =小平果 , age = 22
  p1.setNo("0003");
  console.log(p1.toString());  //no = 0003 , name = 小平果 , age = 22
  p1.no = "0004";
  console.log(p1.toString()); //no = 0003 , name = 小平果 , age = 22

 </script>

これは、これまでに説明した他のオブジェクト作成モードとどのように違うのでしょうか? 上記の例では、オブジェクトのプロパティを作成および参照するときに常に this キーワードを使用します。この例では、これらの変数を var で宣言します。これは、それらが Person コンストラクター内にのみ存在することを意味します。 checkno 関数も同様に宣言されるため、プライベート メソッドになります。

これらの変数や関数にアクセスする必要があるメソッドは、Personal で宣言するだけで済みます。これらのメソッドはパブリックでありながらプライベートなプロパティおよびメソッドにアクセスできるため、特権メソッドと呼ばれます。これらの特権関数にオブジェクトの外部からアクセスするには、先頭にキーワード this を付けます。これらのメソッドは Person コンストラクターのスコープ内で定義されているため、プライベート プロパティにアクセスできます。これらのプロパティはパブリックではないため、this キーワードを使用せずに参照されます。すべての getter メソッドと assigner メソッドは、これを使用せずにこれらのプロパティを直接参照するように変更されました。

プライベート プロパティへの直接アクセスを必要としないメソッドは、元どおり Person.prototype で宣言できます。 toString() メソッドと同様です。プライベート メンバーへの直接アクセスを必要とするメソッドのみを特権メソッドとして設計する必要があります。ただし、各オブジェクト インスタンスにはすべての特権メソッドの新しいコピーが含まれるため、特権メソッドが多すぎるとメモリが大量に消費されます。

上記のコードを見ると、this. 属性名が削除され、カプセル化が厳密に実装されています。ただし、すべてのメソッドがオブジェクト内に存在します。これによりメモリのオーバーヘッドが増加します。

3. クロージャ

にカプセル化されます。
<script type="text/javascript">

  var Person = (function ()
  {
   //静态方法(共享方法)
   var checkNo = function (no)
   {
    if (!no.constructor == "string" || no.length != 4)
     throw new Error("学号必须为4位");
   };
   //静态变量(共享变量)
   var times = 0;

    //return the constructor.
   return function (no, name, age)
   {
    console.log(times++); // 0 ,1 , 2
    var no , name , age; //私有变量
    this.setNo = function (no) //私有方法
    {
     checkNo(no);
     this._no = no;
    };
    this.getNo = function ()
    {
     return this._no;
    }
    this.setName = function (name)
    {
     this._name = name;
    }

    this.getName = function ()
    {
     return this._name;
    }

    this.setAge = function (age)
    {
     this._age = age;
    }
    this.getAge = function ()
    {
     return this._age;
    }

    this.setNo(no);
    this.setName(name);
    this.setAge(age);
   }
  })();

  Person.prototype = {
   constructor: Person,
   toString: function ()
   {
    return "no = " + this._no + " , name = " + this._name + " , age = " + this._age;
   }
  };

  var p1 = new Person("0001", "小平果", "22");
  var p2 = new Person("0002", "abc", "23");
  var p3 = new Person("0003", "aobama", "24");


  console.log(p1.toString());  //no = 0001 , name = 小平果 , age = 22
  console.log(p2.toString());  //no = 0002 , name = abc , age = 23
  console.log(p3.toString()); //no = 0003 , name = aobama , age = 24

 </script>

上記のコードは、JS エンジンが読み込まれた後、 Person = 即時実行関数を直接実行します。その後、この関数はサブ関数を返します。これは、新しい Person によって呼び出されるコンストラクターであり、サブ関数は次のことを維持します。即時実行関数内の checkNo(no) と time への参照 (明らかなクロージャー)。したがって、checkNo と time は、3 つのオブジェクトを作成した後、それぞれ 0、1、2 になります。このアプローチの利点は、Personal で再利用する必要があるメソッドとプロパティをプライベートにして、オブジェクト間で共有できることです。

ここでの プライベート メンバー特権メンバー は、コンストラクター内で宣言されたままです。ただし、コンストラクターは通常の関数からインライン関数に変更され、それを含む関数の戻り値として変数 person に渡されます。これにより、静的プライベート メンバーを宣言できるクロージャが作成されます。外側の関数宣言の後にある空の括弧のペアは、コードがロードされるとすぐに関数を実行するために非常に重要です。この関数の戻り値は別の関数であり、それが Person 変数に代入されるため、Person はコンストラクターになります。この内部関数は、Person をインスタンス化するときに呼び出されます。外部関数は、静的メンバーを格納するために使用できるクロージャーを作成するためにのみ使用されます。

この例では、 Person のインスタンスごとにこのメソッドの新しいコピーを生成するのは意味がないため、 checkno は静的メソッドになるように設計されています。また、静的属性 time もあり、その関数 は、Person コンストラクター への呼び出しの合計数を追跡することです。

以上がこの記事の全内容です。カプセル化の意味をさらに学ぶのに役立つことを願っています。

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

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

javascriptの分解:それが何をするのか、なぜそれが重要なのかjavascriptの分解:それが何をするのか、なぜそれが重要なのかApr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

pythonまたはjavascriptの方がいいですか?pythonまたはjavascriptの方がいいですか?Apr 06, 2025 am 12:14 AM

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

JavaScriptをインストールするにはどうすればよいですか?JavaScriptをインストールするにはどうすればよいですか?Apr 05, 2025 am 12:16 AM

JavaScriptは、最新のブラウザにすでに組み込まれているため、インストールを必要としません。開始するには、テキストエディターとブラウザのみが必要です。 1)ブラウザ環境では、タグを介してHTMLファイルを埋め込んで実行します。 2)node.js環境では、node.jsをダウンロードしてインストールした後、コマンドラインを介してJavaScriptファイルを実行します。

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

メモ帳++7.3.1

メモ帳++7.3.1

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

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン