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の本質
- 作者: Cody Lindley,和田祐一郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/06/19
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る