Object.createにvirtualほしい

Android向けにModule書くのにObject.defineProperty欲しいなぁ思ったんだけどなくて
Object.createならPolyfillあったよな・・・って調べたら

これだった

if (!Object.create) {
  Object.create = function (o) {
    if (arguments.length > 1) {
      throw new Error('Object.create implementation only accepts the first parameter.');
    }
    function F() {}
    F.prototype = o;
    return new F();
  };
}

(arguments.length > 1)って動かないじゃないですかやだー


自分でObject.createを再現しようと思ったんですがstrictモードの制御はできなそう

writable欲しいけど、無理そうなのでOverrideの可否プロパティを付加する

  • strictモードだとwriteしたときに叱ってくれる
  • override可能なメソッド -> virtual
  • writableがtrueだったらvirtualもtrue

って発想


途中まで無理矢理書いた

if(!Object.create) {
  Object.create = function (o, prop) {
    'use strict';
    o['_options'] = o['_options'] || {};
    var keys = Object.keys(prop);
    keys.map(function(key) {
      if (key in o) {
        if (o['_options']['virtual'] !== true) {
          throw new TypeError("Cannot overide property '"+ key +"' of #<Object>'");
        }
      }
      o['_options'][key] = {
        'writable': prop[key]['writable'] || false,
        'configurable': prop[key]['configurable'] || false,
        'enumerable': prop[key]['enumerable'] || false,
        'virtual': prop[key]['writable'] || false
      };
      o[key] = prop[key]['value'];
    });
    return o;
  };
}
 
 
// モジュール
(function (global) {
  'use strict';
  var modName = 'foo';
  var globalMod = global[modName] || {};
  var mod = Object.create(globalMod, {
    newOne: {
      writable: false,
      configurable: false,
      enumerable: true,
      value: function () {return 'Hello World!'; }
    }
  });
  global[modName] = mod;
}(this));


_optionsとかひどい

おしまい。

開眼!  JavaScript ―言語仕様から学ぶJavaScriptの本質

開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質