導入
この記事では、主にオブジェクトの作成パターンを紹介します。さまざまな手法を使用すると、エラーを大幅に回避したり、非常に合理化されたコードを記述したりできます。
パターン1:名前空間
名前空間は、競合や過度の命名を避けるために必要なグローバルな命名の量を減らすことができます。一般的に、オブジェクトレベルを定義すると、しばしば次のようになります。
コードコピーは次のとおりです。
var app = app || {};
app.modulea = app.modulea || {};
app.modulea.submodule = app.modulea.submodule || {};
app.modulea.submodule.methoda = function(){
console.log( "print a");
};
app.modulea.submodule.methodb = function(){
console.log( "print b");
};
多くのレベルがある場合、私たちはこのように続けなければなりません。これは非常に混乱しています。この問題を解決するために、名前空間パターンが存在します。コードを見てみましょう:
コードコピーは次のとおりです。
//不安で、既存のMyAppオブジェクトを上書きする可能性があります
var myApp = {};
// 大丈夫
if(typeof myApp === "undefined"){
var myApp = {};
}
//より簡単な方法
var myApp = myApp || {};
//一般的な方法を定義します
myapp.namespace = function(ns_string){
var parts = ns_string.split( '。')、
親= myapp、
私;
//デフォルトでは、最初のノードがmyAppの場合、myapp.moduleaなど、それは無視されます
if(parts [0] === "myApp"){
パーツ= parts.slice(1);
}
for(i = 0; i <parts.length; i += 1){
//プロパティが存在しない場合は、作成します
if(typeof parent [parts [i]] === "未定義"){
親[parts [i]] = {};
}
親=親[パート[i]];
}
親を返します。
};
コードを呼び出すことは非常に簡単です:
コードコピーは次のとおりです。
//名前空間の後、戻り値をローカル変数に割り当てることができます
var module2 = myapp.namespace( 'myapp.modules.module2');
console.log(module2 === myapp.modules.module2); // 真実
// myAppをスキップします
myapp.namespace( 'modules.module51');
//非常に長い名前
myapp.namespace( 'and.upon.a.time.was.this.long.nested.property');
パターン2:依存関係の定義
モジュールまたは関数がいくつかのサードパーティモジュールまたはツールを参照する場合があります。これらの従属モジュールを最初に定義して、将来簡単に交換できるようにするのが最善です。
コードコピーは次のとおりです。
var myfunction = function(){
//モジュールに依存します
var event = yahoo.util.event、
dom = yahoo.util.dom;
//ローカル変数イベントとDOMは、他の機能の後にコードで使用されます
};
パターン3:私有地とプライベートメソッド
JavaScriptは、私的なプロパティとプライベートメソッドをサポートするための特定の構文を提供しませんが、閉鎖を通じてそれを実装できます。コードは次のとおりです。
コードコピーは次のとおりです。
function gadget(){
//プライベートオブジェクト
var name = 'ipod';
//パブリック関数
this.getName = function(){
返品名;
};
}
var toy = new Gadget();
//名前は未定義であり、プライベートです
console.log(toy.name); // 未定義
//パブリックメソッドアクセス名
console.log(toy.getName()); //「iPod」
var myobj; //自己実行関数を介してMYOBJに値を割り当てます
(関数 () {
//無料オブジェクト
var name = "my、oh my";
//公開部品を実装するので、varはありません
myobj = {
//承認方法
getName:function(){
返品名;
}
};
}());
モード4:啓示モード
また、「JavaScriptシリーズ(3)の詳細な理解:モジュールパターンの包括的な分析」のモジュールパターンに多少似たプライベートメソッドの隠蔽に関するものですが、リターンメソッドではありませんが、変数は外部的に宣言され、パブリックメソッドが変数内部に割り当てられます。コードは次のとおりです。
コードコピーは次のとおりです。
var MyArray;
(関数 () {
var astr = "[オブジェクトアレイ]"、
toString = object.prototype.toString;
関数isArray(a){
returtring.call(a)=== astr;
}
関数indexof(haystack、針){
var i = 0、
max = haystack.length;
for(; i <max; i += 1){
if(haystack [i] === needle){
私を返します。
}
}
return -1;
}
//割り当てにより、上記のすべての詳細が非表示になります
myArray = {
ISARRAY:ISARRAY、
indexof:indexof、
Inarray:indexof
};
}());
//テストコード
console.log(myarray.isarray([1、2])); // 真実
console.log(myarray.isarray({0:1})); // 間違い
console.log(myarray.indexof(["a"、 "b"、 "z"]、 "z")); // 2
console.log(myarray.inarray(["a"、 "b"、 "z"]、 "z")); // 2
myarray.indexof = null;
console.log(myarray.inarray(["a"、 "b"、 "z"]、 "z")); // 2
モード5:チェーンモード
チェーンモードを使用すると、obj.add(1).remove(2).delete(4).add(2)など、オブジェクトメソッドを継続的に呼び出すことができます。実装のアイデアは非常に簡単です。これは、これをそのまま返すことです。コードは次のとおりです。
コードコピーは次のとおりです。
var obj = {
値:1、
増分:function(){
this.value += 1;
これを返します。
}、
追加:function(v){
this.value += v;
これを返します。
}、
叫び:function(){
console.log(this.value);
}
};
//チェーンメソッド呼び出し
obj.increment()。add(3).shout(); // 5
// 1つずつ呼び出すこともできます
obj.increment();
obj.add(3);
obj.shout();
要約します
この記事は、オブジェクト作成モードの以前の記事ですので、明日は次の記事をお楽しみに。