ホームページ > ウェブフロントエンド > jsチュートリアル > Cookie 操作の JavaScript カプセル化の概要_JavaScript スキル

Cookie 操作の JavaScript カプセル化の概要_JavaScript スキル

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-05-16 18:37:50
オリジナル
1113 人が閲覧しました

Javascript にはプライベートおよびパブリックのアクセス権設定のキーワードがありませんが、特定の手法を使用して同じ結果をシミュレートできます。
まず、次のコード行を見てみましょう:
var i = (1, 2, 3)。 , 4 , 5);
変数 i の最終結果は 5 です。
これはカンマ演算子の結果であり、括弧はこのコード行の優先順位を変更することを意味します。それ以外の場合、var i = 1, 2, 3, 4, 5; は識別子が見つからないというエラーを報告します。


var i = (1, 2, 3, 4, function(){ return 5 * 5;});
変数 i の最終結果は、結果 25 を返す関数です。
これは、事前に宣言しなくても任意の型を割り当てることができる Javascript の柔軟性です。次の呼び出し:

i ();
alert( i() );
は 25 を返すメソッド呼び出しを取得します。


変数を続けます。 i は、代入演算子を介して関数の参照を取得します。つまり、等号の右側の括弧の演算後に返された最後の結果への参照は、呼び出しを表示することはできませんが、存在します。変数への参照なしで呼び出された場合はどうなりますか?コードが実行されると、メッセージ ボックスが表示され、25 が表示されます。
表示の便宜上、I 前の例の関数は、
2 組のかっこ () () のポップアップ メッセージ ボックスに変更されました。 ; 最初のペアは、結果が関数である場合、2 番目の括弧のペアによって呼び出しが行われることを示します。つまり、参照のために前の括弧のペアを介して匿名関数への参照が行われます。以下は匿名関数の呼び出しです。
匿名関数の使用方法の詳細については、記事の最後にある参考リンクを参照してください。

クロージャが生成される理由は次のとおりです。スコープが異なるため、子スコープは親スコープの変数を参照し、子スコープに戻ります。ただし、親スコープは実行後に破棄される必要がありますが、子スコープは常に存在し、子スコープへの参照を持っています。
次のコードを見てください




コードをコピーします

関数子(){
var b = 2;
アラート(b);
}
}


親関数parentには子関数が含まれており、子関数には親関数のa変数への参照があります。
実行後に親関数が宣言された子関数を返せるようにしましょう



コードをコピーします
コードは次のとおりです。 : 関数parent() { var a = 1; function child(){
var b = 2;
alert(b);
}
return child;
var t =parent()
t(); 10 行目親関数を実行し、関数内で宣言された子関数を返します。このとき、変数 t には返されたオブジェクト (この時点では実行可能な関数) への参照が保持されており、それを 11 行のコードで呼び出しました。結果はそれぞれ出力 1 と 2 です。
出力 2 はサブ関数本体で変数を宣言したためであり、出力 1 は関数本体で対応する変数 a を定義していないためです。交換が発生しました。親関数内の変数への参照、つまり親スコープ内の変数の参照は完了しています。つまり、変数 a はまだ存在しています。関数は実行されており、対応する参照がないため、直接参照することはできません (親 .a など)。返されたサブ関数の参照を介してのみアクセスできます。
他の変数を宣言した場合はどうなるでしょうか。結果は同じで、サブ関数にアクセスできますが、サブ関数が対応する参照を返さない場合、外部からはまったくアクセスできません。これはクロージャを形成します。 🎜>クロージャでできることは何ですか? 外部の世界に自由に変更されたくない変数がある場合は、



コードをコピー

コードは次のとおりです:


myObj = {} //ウィンドウ オブジェクト (window. myObj)
(function(){
var i = 4;
myObj = { //グローバル変数を参照し、値を代入します
getI : function() { //メソッドを取得, a function i = val;
}
}
})(); //匿名関数の呼び出しも関数ですしたがって、これはサブスコープとして使用され、コード汚染を避けるために実行後に破棄されます
myObj.setI(5); //Success
myObj.setI(101); //Failure
alert( myObj.getI());
alert(myObj.i); //エラー、そのような属性はありません



これまでは、パブリック アクセス権とプライベート アクセス権 (つまり、必要なものを提供し、提供したくないものは提供しない) を実装しただけです。



In ページでは、通常、document.cookie 属性を使用してアクセスします。これに新しい値を割り当てると、Cookie には通常、値 (保存された値)、日付 (時刻) の 5 つの属性があります。 UTC形式で、何を表すのか) 有効期限、ドメイン(ドメイン、Cookie所有者)、パス(サブディレクトリ)
通常の開発では、document.cookie属性だけでアクセスすると非常に面倒になりますが、文字列にのみ文字を割り当てることができ、指定された変数名の値を取得するには、読み取り後に文字列を切り取る必要があるため、document.cookie を読み取ると、有効期限などの情報を除いて、割り当てられたすべての値が返されます。
コードは以下に添付されており、すべて Cookie グローバル オブジェクトにカプセル化されており、いくつかのメソッドが公開されています。
Get: 指定されたすべての Cookie 文字列を元に戻します。 Cookie 文字列を設定します。
Clear: すべての Cookie オブジェクトをクリアします。
Write: オーバーロードされた Cookie を参照します。 : Cookie をクエリします。詳細については、コードを参照してください。







コードをコピーします
コードは次のとおりです:

Cookie = {};
/*
* Date オブジェクトの setTime メソッドは、1970-01-01 からのミリ秒数を設定し、オブジェクトに設定して、それ以降の日付 元のオブジェクトではなくミリ秒数。
* Cookie が期限切れ属性を設定していない場合、または有効期限が現地時間より短い場合、次回の閲覧時に期限切れになります。
* document.cookie オブジェクトは、有効期限などを含まないすべての値を文字列形式で返します。 🎜>var isString = function(v ) {
return typeof v === "string";
}
var isArray = function(v) {
return Object.prototype.toString.apply( v) == "[オブジェクト配列]";
}
var isObject = function(v) {
return v && typeof v == "object";
var isDate = function(v) {
return Object.prototype.toString.apply(v) == "[オブジェクト日付]";
var getTime = function() {
return new Date() .getTime();
}
var trim = function(val) {
return (val || "").replace(/^s |s $/g, ""); }
var tryEval = function (val) {
var Obj, e;
try {
Obj = eval(val)
} catch (e) {
Obj = val ;
}
return Obj;
}
var ObjectToString = function(o) {
var tstr = "{";
if (isArray(o[v] )) {
tstr = v ":" ArrayToString(o[v]) ",";
} else if (isObject(o[v])) {
tstr = v ":" ObjectToString( o[v]) ",";
} else if (isString(o[v])) {
tstr = v ":"" o[v].toString( ) "",";
} else {
tstr = v ":" o[v].toString() ",";
}
}
return tstr.slice(0 , -1) "}";
}
var ArrayToString = function(o) {
var tstr = "[";
for (var v in o) {
if (isArray (o[v])) {
tstr = ArrayToString(o[v]) ",";
} else if (isObject(o[v])) {
tstr = ObjectToString(o[v] ]) ",";
} else {
tstr = o[v].toString() ",";
}
}
return tstr.slice(0, -1) "]";
}
Cookie = {
Get: function() {
return document.cookie;
Set: function(val) {
document.cookie = val;
},
Clear: function() {
var temp = this.Query()
for (o in temp); >this.Delete(o);
}
},
GetDayTime: function(val) {
var texires = new Date();
texires.setTime() val * nDay);
return texires;
書き込み: function() {
/*
* Cookie.Write(Object); >* Cookie.Write(varname , Object); varname: 変数名、Object: 書き込みオブジェクト;
* Cookie.Write(Object, Date);
* Cookie。 Write(varname, Object , Date); varname: 変数名, オブジェクト: 書き込みオブジェクト, 日付: 有効期限; Cookie.Write(varname, Object, Date, Domain, Path);オブジェクトの書き込み、日付: 有効期限、ドメイン: ドメイン、パス: サブディレクトリ;
*/
if (arguments.length == 1) {
var tvalue = argument[0]; = " ";
var texires = new Date(); texpires.setTime() 1 * nDay);
if (isArray(tvalue)) {
tstr = ArrayToString(tvalue);
} else if (isObject(tvalue)) {
tstr = ObjectToString(tvalue);
} else {
tstr = tvalue.toString();
tstr = " main= "escape(tstr) ";expires="texpires.toGMTString() ";";
} else if (arguments.length == 2) {
var tname, tvalue, texires, tstr = "" ;
if (isDate(arguments[1])) {
tname = "main";
tvalue = argument[1]; else {
tname = 引数[0];
tvalue = 引数[1];
texpires.setTime() 1 * nDay); >if (isArray(tvalue)) {
tstr = ArrayToString(tvalue);
} else if (isObject(tvalue)) {
tstr = ObjectToString(tvalue); else {
tstr = tvalue.toString();
}
tstr = tname "="scape(tvalue) ";expires=" texpires.toGMTString() ";"
} else if (arguments.length == 3) {
var tname = argument[0], tvalue = argument[1], texpires = argument[2], tstr = "";
if (isArray(tvalue)) {
tstr = ArrayToString (tvalue);
} else if (isObject(tvalue)) {
tstr = ObjectToString(tvalue);
} else {
tstr = tvalue.toString();
tstr = tname "="scape(tvalue) ";expires=" texpires.toGMTString() ";";
} else if (arguments.length == 5) {
var tname = argument[ 0] 、tvalue = 引数[1]、texpires = 引数[2]、tdomain = 引数[3]、tpath = 引数[4]、tstr = "";
if (isArray(tvalue)) {
tstr = ArrayToString(tvalue);
} else if (isObject(tvalue)) {
tstr = ObjectToString(tvalue);
} else {
tstr = tvalue.toString(); }
tstr = tname "="scape(tvalue) ";expires=" texpires.toGMTString() ";domain=" tdomain ";path=" tpath ";";
}
alert(tstr) );
this.Set(tstr)
},
Query: function() {
/*
* Cookie.Query(); すべての Cookie 値で構成されるオブジェクトを返します。指定された名前; 失敗した場合は、未定義を返します。 Cookie.Query(string, Object); 失敗した場合は、指定された名前のオブジェクトを返します。 /
var tname = tvalue = " ", tright = -1;
var tstr = this.Get();
var tObj = {}; {
var i = 0;
do {
tname = trim(tstr.slice(i, tstr.indexOf("=", i))); ;", i);
if (tright == -1) {
tvalue = unescape(tstr.slice(tstr.indexOf("=, i) 1, tstr.length));
} else {
tvalue = unescape( tstr.slice(tstr.indexOf("=, i) 1, tright));
}
tObj[tname] = tryEval(tvalue); i = tstr.indexOf(";", i) == -1 ? -1 : tstr.indexOf(";", i) 1; while (i != -1); {
tname = argument[0] ;
if (tstr.indexOf(tname) == -1) 戻り値
var i = tstr.indexOf(tname); tstr.slice(i, tstr.indexOf( "=, i)));
tright = tstr.indexOf(";", tstr.indexOf(tname)) == tstr.length : tstr ? IndexOf(";", tstr.indexOf(tname));
tvalue = unescape(tstr.slice(tstr.indexOf(tname) tname.length 1, tright)); 1) {
tObj = tryEval( tvalue);
} else if (arguments.length == 2) {
tObj = argument[1];
tObj[tname] = tryEval(tvalue) ;
}
}
return
},
Update: function() {
return this.Write.apply(this, argument); 🎜>削除: function() {
if (arguments.length == 1) {
var varname = argument[0];
if (this.Query(varname)) {
this. Update(varname, "", new Date(1970, 01, 01));
}
}
}
}



実行があります文字列からオブジェクトへの eval を実行し、Object または Array オブジェクトから対応する関数を文字列の形式で取得し、一部の JSON 操作をシミュレートします。もちろん、すべての JavaScript オブジェクトを保存することはできず、一部のみが満たされます。


私の個人的な理解には限界があるので、アドバイスをお願いします。
JavaScript の匿名関数:

http://dancewithnet.com/2008/ 05/07/javascript-anonymous-function/


JavaScript 閉鎖:
http://www.cn-cuckoo.com/wordpress/wp-content/uploads/2007/ 08/JavaScriptClosures.html


Cookie ファイル形式:

http://www.cnblogs.com/sephil/archive/2008/05/06/cookiefmt.html
関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート