JavaScriptのすべてはオブジェクトです:文字列、配列、値、機能など。 JSには概念はありません。
しかし、JSの文法特性を使用して、クラスのアイデアを備えたオブジェクトを作成できます。
元の方法
次のようにコードコードをコピーします。
<script type = "text/javascript">
var obj = new object();
obj.name = "koji"; //オブジェクトに属性を追加します
obj.age = 21;
obj.showname = function(){//オブジェクトにメソッドを追加します
アラート(this.name);
}
obj.showage = function(){
アラート(this.age);
}
obj.showname();
obj.showage();
</script>
上記の方法は、新しいキーワードを介してオブジェクトを生成し、JSに従って動的言語の特性のプロパティとメソッドを追加します。
オブジェクトを作成します。その中で、これはメソッドを呼び出すオブジェクトです。
この方法での問題は、オブジェクトを複数回作成する必要がある場合、コードを複数回繰り返す必要があることです。これは、コードの再利用を助長しないことです。
工場法
次のようにコードコードをコピーします。
<script type = "text/javascript">
関数createobj(){
var obj = new object();
obj.name = "koji";
obj.age = 21;
obj.showname = function(){
アラート(this.name);
}
obj.showage = function(){
アラート(this.age);
}
OBJを返します
}
var obj1 = createobj();
var obj2 = createobj();
obj1.showname();
obj2.showage();
</script>
この方法により、コードの再利用率が向上し、工場の方法を変更してパラメーターの割り当てを渡すこともできます。
次のようにコードコードをコピーします。
<script type = "text/javascript">
関数createobj(name、age){//オブジェクトを構築するとき、初期化パラメーターを渡すことができます
var obj = new object();
obj.name = name;
obj.age = age;
obj.showname = function(){
アラート(this.name);
}
obj.showage = function(){
アラート(this.age);
}
OBJを返します
}
var obj1 = createobj( "koji"、22);
var obj2 = createobj( "luo"、21);
obj1.showname();
obj1.showage();
obj2.showname();
obj2.showage();
</script>
上記の方法はコードの更新率を上げることができますが、オブジェクト指向クラスの概念と比較して大きな欠陥があります。麺
相対的な画像は、オブジェクトのプロパティを強調し、オブジェクトの方法が共有されます。そして、お互いのオブジェクトを作成するための上記の工場の方法
オブジェクトは独自の利己的な方法を作成します。同時に、各オブジェクトに対して同じロジックを作成するのと同じ方法は、メモリの無駄です。次のように改善されました
次のようにコードコードをコピーします。
<span style = "font-size:14px;"> <script type = "text/javascript">
関数createobj(name、age){{
var obj = new object();
obj.name = name;
obj.age = age;
obj.showname = showname;
obj.showage = showage;
OBJを返します
}
function showname(){//関数もオブジェクトです
アラート(this.name);
}
関数show(){
アラート(this.age);
}
var obj1 = createobj( "koji"、22);
var obj2 = createobj( "luo"、21);
obj1.showname();
obj1.showage();
obj2.showname();
obj2.showage();
</script> </span>
上記の関数オブジェクトは、異なるオブジェクトを保持する関数オブジェクトの私的な問題を解決するために定義されています。これで、すべてのオブジェクトがあります
上記の2つの関数への参照を保持します。しかし、このようにして、オブジェクトの機能は独立しており、オブジェクトとは無関係になりました。これと
オブジェクト指向の特定の方法の特定の方法は、特定のカテゴリの考えを満たしていません。
構造関数方法
次のようにコードコードをコピーします。
<script type = "text/javascript">
//コンストラクターを定義して、対応するオブジェクトを生成します
関数担当者(名前、年齢){
//コードの最初の行を実行する前に、新しい人を呼び出すとき、人は人オブジェクトであり、オブジェクトはメモリにあります
//このキーワードには、インデックス割り当てが与えられます。
this.name = name; //このキーワードは少なくてはなりません。現在のオブジェクト、つまり、このキーワードによって参照されるオブジェクトの名前属性割り当てについて
//実際には、現在のオブジェクトに名前プロパティを追加してから、その名前属性に値を割り当てることと同等です。
this.age = age;
this.showname = function(){//現在のオブジェクトにメソッドを追加する
アラート(this.name);
}
this.showage = function(){
アラート(this.age);
}
//現在のオブジェクトを割り当て記号の左側にある変数に返します(返品を使用する必要はありません)
}
var obj1 =新しい人( "koji"、22);
var obj2 = new person( "luo"、21);
obj1.showname();
obj1.showage();
obj2.showname();
obj2.showage();
</script>
関数を構築する方法は、工場法と同じであり、各オブジェクトに排他的な関数オブジェクトを作成します。もちろん、これらの機能を配置することもできます
オブジェクトはコンストラクターの外側で定義されているため、オブジェクトとメソッドは互いに独立しています。
プロトタイプ方法:この方法で使用されるオブジェクトのプロトタイププロパティ
次のようにコードコードをコピーします。
script type = "text/javascript">
function person(){} //空気構成関数を定義し、パラメーターを渡すことができません
//すべての属性のすべての方法をプロトタイプ属性に与える
person.prototype.name = "koji";
person.prototype.age = 22;
person.prototype.showname = function(){//メソッドを追加します
アラート(this.name);
}
person.prototype.showage = function(){
アラート(this.age);
}
var obj1 = new person();
var obj2 = new person();
obj1.showname();
obj1.showage();
obj2.showname();
obj2.showage();
</script>
Personオブジェクトが生成されると、プロトタイプの属性が新しいオブジェクトに割り当てられます。次に、属性とメソッドが共有されます。
この方法の問題は、コンストラクターを渡すことができず、新しく生成された各オブジェクトにデフォルト値があることです。第二に、メソッド共有は共有されません
問題は、属性が状態を変更できるオブジェクトである場合、属性共有が問題です。
次のようにコードコードをコピーします。
<script type = "text/javascript">
function person(){} //空気構成関数を定義し、パラメーターを渡すことができません
person.prototype.age = 22;
person.prototype.array = new Array( "koji"、 "luo");
person.prototype.showage = function(){
アラート(this.age);
}
person.prototype.showarray = function(){
アラート(this.array);
}
var obj1 = new person();
var obj2 = new person();
obj1.array.push( "kyo");
obj1.showarray();
obj2.showarray();
</script>
上記のコードがOBJ1の属性にOBJ1の属性に要素を追加すると、OBJ2のARRA属性の要素も従います。
影響は、OBJ1およびOBJ2オブジェクトの配列プロパティが同じ配列オブジェクトを引用しているため、この配列を変更することです
オブジェクト、配列オブジェクトの属性は自然に自然に影響を受けます
混合コンストラクター/プロトタイプメソッド
コンストラクターを使用してオブジェクトの属性を定義し、プロトタイプを使用してオブジェクトを定義し、属性を達成できるようにします
プライベート、およびメソッド共有。
次のようにコードコードをコピーします。
<script type = "text/javascript">
関数担当者(名前、年齢){
this.name = name;
this.age = age;
this.array = new Array( "koji"、 "luo");
}
person.prototype.showname = function(){
アラート(this.name);
}
person.prototype.showarray = function(){
アラート(this.array);
}
var obj1 =新しい人( "koji"、22);
var obj2 = new person( "luo"、21);
obj1.array.push( "kyo");
obj1.showarray();
obj1.showname();
obj2.showarray();
obj2.showname();
</script>
属性がプライベートである後、それぞれの属性を変更しても、他のオブジェクトには影響しません。同時に、この方法は各オブジェクトによっても共有されます。意味的に、
これは、Face -Objectプログラミングの要件を満たしています。
動的プロトタイプ
次のようにコードコードをコピーします。
<script type = "text/javascript">
関数担当者(名前、年齢){
this.name = name;
this.age = age;
this.array = new Array( "koji"、 "luo");
//人オブジェクトに_initializedが未定義である場合、人のプロトタイプにまだメソッドを追加していないことを示します
ifof person._initialized == "Underfined")
{{
person.prototype.showname = function(){
アラート(this.name);
}
person.prototype.showarray = function(){
アラート(this.array);
}
person._initialized = true; // trueに設定する必要はありません
}
}
var obj1 =新しい人( "koji"、22);
var obj2 = new person( "luo"、21);
obj1.array.push( "kyo");
obj1.showarray();
obj1.showname();
obj2.showarray();
obj2.showname();
</script>
この方法は、コンストラクター/プロトタイプに似ています。同時に、メソッドをコンストラクターに入れるだけです
IFステートメントが1回しか実行できないことを確認するために、関数担当者に属性が追加されます
実際のアプリケーションで最も広く使用されているのは、コンストラクター/プロトタイプ法です。動的プロトタイプメソッドも非常に人気があり、関数と構造があります
関数/プロトタイプメソッドは同等です。コンストラクターまたはプロトタイプメソッドのみを使用しないでください。