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>