Object.createのメモ書き
クッキーでオブジェクトを考えてみる
<!DOCTYPE html> <html lang="ja"> <meta charset="utf8"> <body> <h1>theCookie</h1> <p> <a href="htp://www.test.jp">TEST</a> <script> /* Object.defineProperty (obj, prop, descriptor); descriptor = { configurable : false, // true->プロパティを変更・削除が可能 enumerable : false, // true->プロパティに列挙される value : undefined, // プロパティに関連づけられた値 writable : false, // true->プロパティに関連づけられた値の変更が可能(データディスクリプタのみ) get : undefined, //getter 関数(ない場合は undefined) set : undefined //setter 関数(ない場合は undefined) }; */ var theWorker = new Object; function Cookie () { var doc = this.document || document; // 最初にどのdocumentなのか定義 if (! navigator.cookieEnabled) // クッキーが使えない throw new Error; // 内部呼び出しで、クッキーに書き込む function _setCookie (doc, name, value, expires, path, domain, secure) { if (3 > arguments.length) throw new Error; var cookie = [ encodeURIComponent (name) + '=' + encodeURIComponent (value) ]; if (expires) cookie[cookie.length] = 'expires=' + new Date (expires).toUTCString (); if (path) cookie[cookie.length] = 'path=' + encodeURI (path); if (domain) cookie[cookie.length] = 'domain=' + encodeURI (domain); if (secure) cookie.push ('secure'); doc.cookie = cookie.join ('; '); } // 内部呼び出しで、クッキーの読み出す function _getCookie (doc, name) { if (2 > arguments.length) throw new Error; var n = encodeURIComponent (name).replace (/\W/g, '\\$&'); var v = doc.cookie.match (new RegExp (n + '\\s*=\\s*(.*?)(?:[;,\\s]|$)')); return (v) ? decodeURIComponent (v[1]): ''; } // クッキーを保存する データはオブジェクトから列挙する function SaveCookie (obj, expires, path, domain, secure) { if (1 > arguments.length) throw new Error; for (var prop in obj) if (obj.hasOwnProperty (prop)) _setCookie (doc, prop, String (obj[prop]), expires, path, domain, secure); } // 文字列から空白削除 function _trim (str) { return String (str).trim (); } // str を '=' で区切り name と vallue に分けてオブジェクトに追加する function _collect (result, str) { var nv = str.split ('=', 2); if (2 == nv.length) result[decodeURIComponent (_trim (nv[0]))] = decodeURIComponent (_trim(nv[1])); return result; } // クッキーを取得する 引数がない場合は、すべてをオブジェクトにして返す。 function LoadCookie (obj) { if (1 > arguments.length) { return doc.cookie.split (';').reduce (_collect, new Object); /* obj = new Object; var reg = new RegExp ('(?:^\\s*|\\s+)(.+?)\\s*\\=\\s*(.*?)\\s*(?:;|$)', 'g'); var c = doc.cookie; var v; while (v = reg.exec (c)) obj[decodeURIComponent (v[1])] = decodeURIComponent (v[2]); */ } else { for (var prop in obj) if (obj.hasOwnProperty (prop)) obj[prop] = _getCookie (doc, prop); } return obj; } return { saveCookie: { value: SaveCookie, enumerable: true }, loadCookie: { value: LoadCookie, enumerable: true } }; } theWorker = Object.create (theWorker, Cookie ()); theWorker.saveCookie ({ abc: 456, def: 999}, Date.UTC (2014, 4, 30, 0, 0, 0)); a = theWorker.loadCookie (); alert ([a.abc, a.def]); </script>
N-BASIC お〜懐かしい。しかし、私は MZ-80B の BASICからで、のちに、PC-9801U2 のN88-日本語BASIC(86) です。
ポケコンも懐かしいです。たしか PC-1260 だったでしょうか?なけなしの小遣いで買った記憶があります。そして、雑誌にあったプログラムに、peek, poke とかがあり、「なんじゃこれ!」てメモリーのいたるところに、書き込んで暴走(?)させた記憶があります。
オブジェクトを繋げてしまえ!
http://oshiete.goo.ne.jp/qa/8553893.html
初回アクセスから●時間経過後、一部を書き換える
夜が更けて朝になっていた。もう後半は眠くてぐだぐだ。
関数 Tools の引数のオブジェクトを繋げてみな兄弟
<!DOCTYPE html> <html lang="ja"> <meta charset="utf8"> <body> <h1>Cominng Soon Test</h1> <p> <a> <span id="hoge">Cominng Soon</span> </a> </p> <script> function Cookie () { var doc = this.document || document; // 最初にどのdocumentなのか定義 if (! navigator.cookieEnabled) // クッキーが使えない throw new Error; // 内部呼び出しで、クッキーに書き込む function _setCookie (doc, name, value, expires, path, domain, secure) { if (3 > arguments.length) throw new Error; var cookie = [ encodeURIComponent (name) + '=' + encodeURIComponent (value) ]; if (expires) cookie[cookie.length] = 'expires=' + new Date (expires).toUTCString (); if (path) cookie[cookie.length] = 'path=' + encodeURI (path); if (domain) cookie[cookie.length] = 'domain=' + encodeURI (domain); if (secure) cookie.push ('secure'); doc.cookie = cookie.join ('; '); } // 内部呼び出しで、クッキーの読み出す function _getCookie (doc, name) { if (2 > arguments.length) throw new Error; var n = encodeURIComponent (name).replace (/\W/g, '\\$&'); var v = doc.cookie.match (new RegExp (n + '\\s*=\\s*(.*?)(?:[;,\\s]|$)')); return (v) ? decodeURIComponent (v[1]): ''; } // クッキーを保存する データはオブジェクトから列挙する function SaveCookie (obj, expires, path, domain, secure) { if (1 > arguments.length) throw new Error; for (var prop in obj) if (obj.hasOwnProperty (prop)) _setCookie (doc, prop, obj[prop] || '', expires, path, domain, secure); } // 文字列から空白削除 function _trim (str) { return String (str).trim (); } // str を '=' で区切り name と vallue に分けてオブジェクトに追加する function _collect (result, str) { var nv = str.split ('=', 2); if (2 == nv.length) result[decodeURIComponent (_trim (nv[0]))] = decodeURIComponent (_trim(nv[1])); return result; } // クッキーを取得する 引数がない場合は、すべてをオブジェクトにして返す。 function LoadCookie (obj) { if (1 > arguments.length) { return doc.cookie.split (';').reduce (_collect, new Object); /* obj = new Object; var reg = new RegExp ('(?:^\\s*|\\s+)(.+?)\\s*\\=\\s*(.*?)\\s*(?:;|$)', 'g'); var c = doc.cookie; var v; while (v = reg.exec (c)) obj[decodeURIComponent (v[1])] = decodeURIComponent (v[2]); */ } else { for (var prop in obj) if (obj.hasOwnProperty (prop)) obj[prop] = _getCookie (doc, prop); } return obj; } return { saveCookie: { value: SaveCookie, enumerable: true }, loadCookie: { value: LoadCookie, enumerable: true } }; } var Events = { handleEvent: { value: function (evt) { var $ = this; switch (evt.type) { case 'load': var o = $.loadCookie (); var timeString = o[$.cookieName]; var dt, dt0, dt1; if (timeString) { dt0 = +new Date (timeString); dt1 = +getUTCDateByServer (); if (dt1 > dt0 + $.keepTime - $.waitTime) { //cookie reset o[$.cookieName] = null; $.saveCookie (o); } if (dt1 > dt0) this.success.call (this, evt); } else { dt = +getUTCDateByServer (); o[$.cookieName] = (new Date (dt + $.waitTime)).toString (); $.saveCookie (o, new Date (dt + $.keepTime)); } break; } } }, success: { value: function (evt) { var $ = this; var win = evt.currentTarget; var t = win.document.querySelector ('#hoge'); t.textContent = $.message; t.parentNode.href = $.url; // var o = {}; o[$.cookieName] = null; $.saveCookie (o);//cookie reset } } }; function getUTCDateByServer ( ) { try { var req = new XMLHttpRequest; req.open ('HEAD', '#', false); req.send (null); return (new Date (req.getResponseHeader ('Date'))); } catch (err) { return new Date; } } var Param = { cookieName: { value: 'minnanihanaishodayo' }, waitTime: { // value: +Date.UTC (1970, 0, 3, 0, 0, 0, 000) // 3日(最大30日程度まで) value: Date.UTC (1970, 0, 1, 0, 0, 5, 000) // 5秒 }, keepTime: { value: Date.UTC (1970, 0, 1, 0, 0, 10, 000) // 10秒 }, message: { value: '詳しい説明はこちら' }, url: { value: 'http://oshiete.goo.ne.jp/qa/8553893.html' } } function Tools (obj) { return Array.prototype.reduce.call (arguments, function (r, o) { return Object.create (r, o) }, new Object); } addEventListener ('load', Tools (Cookie (), Events, Param), false); </script>