この記事で取り上げるトピックは非常に基本的なものであり、多くの人がトリックと考えていますが、JavaScript の基本知識に関する包括的なトピックです。これには、 オブジェクト属性のカプセル化、プロトタイプ、コンストラクター、クロージャー、式 の即時実行に関する知識が含まれます。
パブリックメソッド
パブリック メソッドは、外部からアクセスして呼び出すことができるメソッドです。
// 在对象中 var Restaurant = { name: 'McDonald', // 公有方法 getName: function() { return this.name; } } // 在构造函数中 function Person(name, age) { this.name = name; this.age = age; // 公有方法 this.getName = function() { return this.name; } } // 在原型中 Person.prototype.getAge = function() { return this.age; }
プライベート メソッド および 特権メソッド
定義する特権メソッドは内部のプライベート プロパティとプライベート メソッドにアクセスできるパブリック メソッドを指し、プライベート メソッドは外部の非表示でアクセスできないメソッドを指すため、これら 2 つのメソッドは通常一緒に説明されます。
オブジェクトを定義するには通常 2 つの方法があります。1 つはオブジェクトのインスタンス化またはオブジェクト式を使用する方法、もう 1 つはコンストラクターを使用する方法です。同様に、プライベート メソッドと特権メソッドの定義形式もさまざまな点で異なります。
オブジェクト内
ここでは、Object 式を使用してオブジェクトを作成し、いくつかのプロパティとメソッドを追加し、それを静的な方法で直接呼び出します。オブジェクトのプライベート データは、匿名関数即時実行式 (IIFE) に配置されます。これは、この関数は呼び出された瞬間にのみ存在し、実行後すぐに破棄されることを意味します。
オブジェクト内にプライベートデータを作成する方法は、オブジェクトモード(オブジェクトを作成するモードを指します)のモジュールパターンと呼ばれます。その基本的な形式は次のとおりです:
var yourObject = (function() { // 私有属性和方法 return { // 公有方法和属性 } }) ();
モジュール モードでは、返されるオブジェクト リテラルには、公開できるプロパティとメソッドのみが含まれます。
var Restaurant = (function() { // 私有属性 var _total = 10; // 私有方法 var _buyFood = function() { _total--; }; var _getTotal = function() { return _total; } return { name: 'McDonald', getTotal: _getTotal, buy: _buyFood } }) (); Restaurant.buy(); console.log(Restaurant.name); // 'McDonald' console.log(Restaurant.getTotal()); // 9
内部プライベート変数を間接的に使用し、レストランの名前を初期化するためにクロージャーを使用していることに注意してください。
コンストラクター内
上で紹介したモジュール パターンでプライベート メソッドを作成する場合、パブリック メソッドと特権メソッドの間に本質的な違いはありません。これは、この概念がコンストラクターを使用してプライベート データを作成するときに定義されるためです。
コンストラクターでプライベート プロパティとメソッドを定義すると、クロージャーを使用する必要がなく、呼び出し時にデータを初期化できるため便利です。
function Restaurant(name) { // 私有属性 var _total = 10; // 公有属性 this.name = name; // 私有方法 function _buyFood() { _total--; } // 特权方法 this.buy = function() { _buyFood(); } this.getTotal = function() { return _total; } } // 公有方法, 注意这里不能访问私有成员_total Restaurant.prototype.getName = function() { console.log(_total); // Uncaught ReferenceError: _total is not defined return this.name; } var McDonald = new Restaurant('McDonald'); console.log(McDonald.getName()); // 'McDonald' McDonald.buy(); console.log(McDonald.getTotal()); // 9
2 つを 1 つにした、より柔軟な方法
モジュール パターンを使用すると、モジュール パターンを複数回呼び出すことができ、各実行後に破棄されます。一部の初期化されたデータはコンストラクター メソッドを使用して渡すことができますが、プライベート メンバーのプロパティにはパブリック メソッドではアクセスできません。プライベート データにアクセスする必要があるパブリック メソッドが多数ある場合は、それらをすべて特権メソッドに記述し、最終的にそれらを呼び出します。各インスタンスに不要なメソッドが多数あります。したがって、この 2 つを組み合わせることで相互に補完することができ、組み合わせ方法も非常に簡単です
var Restaurant = (function() { // 私有属性 var _total = 10; // 私有方法 function _buyFood() { _total--; } // 构造函数 function restaurant(name) { this.name = name; this.getTotal = function() { return _total; } } restaurant.prototype.buy = function() { console.log(_total); // 10 _buyFood(); } restaurant.prototype.getName = function() { return this.name; } return restaurant; }) (); var McDonald = new Restaurant('McDonald'); console.log(McDonald.getName()); // 'McDonald' McDonald.buy(); console.log(McDonald.getTotal()); // 9
上記は、この記事のほんの一部を編集者が要約したものです。まだ記載されていない知識がたくさんありますので、ご自身で調べていただければ幸いです。初心者に役立ちます。