JavaScript_javascript スキルでクラス メカニズムとプライベート変数をシミュレートするための方法とアイデア
一部の Javascript フレームワークを使用している場合、同様のコードが表示される場合があります。
var MyClass = new Class({
初期化: function(param, ...) {
this.param = param;
...
},
func1: function( ...) {
...
}
});
var myObj = new MyClass(param);
myObj.func1(...);
これは典型的なオブジェクト指向のクラス メカニズム アプリケーションであり、ネイティブの Javascript クラス メカニズムよりも明確で自然です。さらに、これに基づいて、クラス継承を実装するとさらに便利になります。では、これはどのようにして達成されるのでしょうか?
ご存知のとおり、JavaScript では関数をコンストラクターとして使用してオブジェクトを作成できます。
function MyClass(param) {
this.param = param;
this.func1 = function(..) {
...
};
}
var myObj = new MyClass(param);
myObj.func1();
実際には、非常に単純で難しくありません。ただし、大規模な Javascript クラス ライブラリを構築する場合、大量のコードからどれがクラスで、どれが関数で、どれがクラス属性であるかを見つけるのは面倒です。
もちろん、これはメリットとデメリットを比較するためではなく、新しいクラスがどのように実装されるかに興味があるだけです。
上記のコードで new MyClass() のようなステートメントを使用することは、MyClass が関数である必要があることを意味し、また、リテラルの意味から、その関数が関数オブジェクトを返す必要があることを意味します。 initialize コンストラクタとして使用されるため、new Class から返される関数では、initialize を使用してオブジェクトを初期化する必要があります。この分析に基づいて、次のコードを導き出すことができます:
function Class(argu) {
return function() {
var init = argu['initialize'] function() {}; // コンストラクタの初期化がない場合は、空の関数を使用します。デフォルトのコンストラクターとして
| for(var p in argu) {
| this[p] = argu[p];
| 元の this
}
}
この変換は少しめまいがするので、もっと簡単な方法はありますか?以下のコードを見てください:
var obj = argu['initialize'] || function() {};
for(var p in argu) {
obj.prototype[p] = argu[p]; //注意してください、ここで使用されているのは、prototype
}
return obj // 実際には、やはり関数
}
これで、単純なクラスメカニズムの構築が完了しました。このメカニズムを通じて、クラス コンストラクター、メソッド、プロパティを作成できますが、これらは明らかにパブリックです。では、プライベート変数とメソッドを実装するにはどうすればよいでしょうか。
JavaScript クラスのプライベート変数はクロージャ メカニズムを通じて完了できることがわかっています。ただし、 new Class({...}) を使用して変換した後は、効果的なクロージャを形成するのが明らかに困難です。この問題を回避するにはどうすればよいでしょうか?
JavaScript には、関数オブジェクトの eval() メソッドと toString() メソッドという 2 つのメソッドが用意されており、前者は関数の特定のコードを取得するために使用できます。これら 2 つの方法を使用すると、クラスのプライベート変数を簡単にシミュレートできます:
Function Class(argu) {
var _ = argu['private'] || {};
eval('var obj = ' (argu['initialize'] || function( ) {}).toString());
for(var p in argu) {
if(p == 'initialize' || p == 'private')
continue;
if (typeof argu[p] == 'function')
eval('obj.prototype[p] = ' argu[p].toString());
else
obj.prototype[p] = argu[p];
}
return obj;
}
関数オブジェクトのtoString()メソッドで関数コードを抽出し、evalメソッドで実行これらのコードにより、有効なクロージャ スコープを構築してプライベート メカニズムを実装できます。次のように適用できます:
var person = 新しいクラス({
プライベート: {
身長: 160,
体重: 50
},
初期化: function(名前, 身長, 体重) {
this.name = name;
_.height = 身長 || _.height;
_.weight = 体重 || _.weight;
},
show: function() {
alert('名前:' これ。名前 '/nheight:' _.height '/nweight:' _.weight);
}
});
var my = new Person("Zh");
my.show( );
見た目は良くありませんが、実際のアプリケーションではあまり役に立ちません。主に効率の面で、通常の実装に比べて約4倍の時間がかかります。大規模なクラス ライブラリの構築では、これは許容できませんが、小規模なアプリケーションでは、次のコードを実装する方が簡単かつ直接的です:
function MyClass(param) {
var privateVar = ...;
this.param = param;
this。 func = function () {
alert(privateVar);
};
}

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

それで、あなたはここで、Ajaxと呼ばれるこのことについてすべてを学ぶ準備ができています。しかし、それは正確には何ですか? Ajaxという用語は、動的でインタラクティブなWebコンテンツを作成するために使用されるテクノロジーのゆるいグループ化を指します。 Ajaxという用語は、もともとJesse Jによって造られました

10の楽しいjQueryゲームプラグインして、あなたのウェブサイトをより魅力的にし、ユーザーの粘着性を高めます! Flashは依然としてカジュアルなWebゲームを開発するのに最適なソフトウェアですが、jQueryは驚くべき効果を生み出すこともできます。また、純粋なアクションフラッシュゲームに匹敵するものではありませんが、場合によってはブラウザで予期せぬ楽しみもできます。 jquery tic toeゲーム ゲームプログラミングの「Hello World」には、JQueryバージョンがあります。 ソースコード jQueryクレイジーワードコンポジションゲーム これは空白のゲームであり、単語の文脈を知らないために奇妙な結果を生み出すことができます。 ソースコード jquery鉱山の掃引ゲーム

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

このチュートリアルでは、jQueryを使用して魅惑的な視差の背景効果を作成する方法を示しています。 見事な視覚的な深さを作成するレイヤー画像を備えたヘッダーバナーを構築します。 更新されたプラグインは、jQuery 1.6.4以降で動作します。 ダウンロードしてください

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

この記事では、JQueryとAjaxを使用して5秒ごとにDivのコンテンツを自動的に更新する方法を示しています。 この例は、RSSフィードからの最新のブログ投稿と、最後の更新タイムスタンプを取得して表示します。 読み込み画像はオプションです

Matter.jsは、JavaScriptで書かれた2D Rigid Body Physics Engineです。このライブラリは、ブラウザで2D物理学を簡単にシミュレートするのに役立ちます。剛体を作成し、質量、面積、密度などの物理的特性を割り当てる機能など、多くの機能を提供します。また、重力摩擦など、さまざまな種類の衝突や力をシミュレートすることもできます。 Matter.jsは、すべての主流ブラウザをサポートしています。さらに、タッチを検出し、応答性が高いため、モバイルデバイスに適しています。これらの機能はすべて、物理ベースの2Dゲームまたはシミュレーションを簡単に作成できるため、エンジンの使用方法を学ぶために時間をかける価値があります。このチュートリアルでは、このライブラリのインストールや使用法を含むこのライブラリの基本を取り上げ、
