プロトタイプとクロージャを使用してコンポーネント メソッドを完成させる

高洛峰
リリース: 2016-11-25 13:29:53
オリジナル
1015 人が閲覧しました

Java コード
var Player = (function(){
Player = function(){ //これは単なる空のシェルです
throw new Error("Player オブジェクトをインスタンス化できません。");
};
Player.MIN_EXTENDED_TIME = 1;
Player.MAX_EXTENDED_TIME = 3;
Player._player = false; = {

return Player._player
}; // 修復された Player コンポーネント メソッドを返します。
})();

//var player = 新しいPlayer(); //new Player() は例外をスローします
var player1 = Player.getInstance();
player2.setName("RealPlayer"); )); //RealPlayer を出力します
最終的に定義されたコンポーネント メソッドはプロトタイプを使用して実装されます。これを見てください:
Java コード
function Player(name){
Player.MIN_EXTENDED_TIME = 3;
this._name = name
}; ) {
this._name = 名前
};
Player.prototype.toString = function(){
return "Player: " + this._name
};
alert(player.toString()); //WindowsMediaPlayer を出力
player.setName("RealPlayer"); //RealPlayer を出力

はい、カプセル化、定数、および Object の toString メソッドのオーバーライドがあります。継承などについては、後で説明します。ただし、この種のコンポーネント メソッドの定義は、十分に洗練されておらず、直感的ではありません。メソッドは独立した場所に定義されており、元のコンポーネント メソッドと一緒に配置されません。Java のように定義できれば良いのではないかと思います。

ちなみに、クロージャを使用して実装できます。試してみてください:
Java コード
function Player(name){
Player.MIN_EXTENDED_TIME = 1;
this._name = name)
this._name; = 名前;
};
this.toString = function(){
return "Player: " + this._name;
};

var player("WindowsMediaPlayer"); toString ()); //WindowsMediaPlayer を出力
player.setName("RealPlayer"); //RealPlayer を出力
alert(Player.MAX_EXTENDED_TIME);
Groovy とは異なり、クロージャが使用されます。新しい構文のサポートを含め、大幅に強化されました。JavaScript クロージャは、追加の学習を必要とする特別な構文を持ちません。これらの変数は、バインドされていない変数を含むコンテキストで定義されます。関数が属する場合、この関数はクロージャです。ところで、クロージャの反対は、バインドされていない変数を含まない単なる関数コードではないでしょうか?
書き終えましたが、Player は 1 つだけでシングルトンであるべきだと考えました。Java のようなシングルトン モードを作成できれば一番良いのですが :) が、うまくいきませんでした。 JavaScript はプライベート コンストラクターを作成します。このアイデアを使用してシングルトン パターンを実装するのは現実的ではないようです...
どうすればよいでしょうか?

ただし、方法は常にあります。新しい Player オブジェクトを制御することはできませんが、作成した新しい Player オブジェクトのプロパティと動作を制御することはできます。新しい Player オブジェクトを使用する必要がある場合、それがまったくできないか、空のシェルにすぎないことがわかります。実際のものは依然としてシングルトンの古典的な getInstance メソッドに依存しています:
Java コード
function Player(){
throw new Error("Player オブジェクトをインスタンス化できません。");
}; //これは単なる空のシェルです

(function(){ //これが本物です
Player.MIN_EXTENDED_TIME = 1;
Player. MAX_EXTENDED_TIME = 3;
Player._player = false;
Player.getInstance = function(){
alter("Init...");
Player._player = {
_name : 名前,

};
}
return Player._player ;
})();

//var player = new Player() は例外をスローします
var player1 = Player .getInstance();
var player2 = Player.getInstance( ; (); は例外をスローするため、何も取得されません。getInstance メソッドによって取得されたオブジェクトのみが実際の Player オブジェクトです。上記のコード全体を実行した結果、「Init...」ダイアログ ボックスが 1 回だけ表示され、実際の「コンストラクター ロジック」が 1 回だけ呼び出されることを示します。

これは達成できましたが、まだ小さな後悔が残っています。Player の定義はまだ 2 つの部分に分かれており、1 つの部分は空のシェルを定義し、もう 1 つの部分は Player の定数と getInstance メソッドを定義する匿名関数です。これら 2 つの部分を 1 つに結合することはできませんか?
はい。使用する必要があるのは、小さな匿名関数だけです。これを最初から読む忍耐力があれば、必ず理解できるでしょう:

この時点で、私はようやく安心し、JavaScript オブジェクト指向について深く理解できました。プロトタイプとクロージャという 2 つの鋭い武器をうまく活用することによってのみ、優れたフロントエンド コードを作成できます。一部の同僚は私に個人的に連絡を取りました。私は、基本的なオブジェクト指向と JavaScript の基礎を持つ同僚が何かを得られることを願って、後で簡潔なコードを投稿するよう努めます。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!