Polyfill
3060 ワード
javascript
は様々な歴史的原因及び先端界の典型的な急進的な特徴により、いくつかの良い設計とモジュールが様々なプラットフォームで動作できなくなりました.(ここでは各種プラットフォームは主に各大手のブラウザに年火が加えられないNodejsを指します.)しかし、プログラマはそのために書類を作成する必要があります.プログラマーは各種モジュールのpolyfillを知る必要があります.Object.sign
、extend
、clone
、Seajs
などの関数に小さいものがあります.大きなモジュールは、Requirejs
、Promise
のようなファイルモジュールローディングモジュール、callback hell
のような解決モジュールを担っています.工事が実際に必要である限り、主流のプラットフォームによって実現されない限り、私達は必ずそれを実現しなければなりません.幸いなことに、これは開源のいい時代です.一部のモジュールはgoogle
、github
にあります.ここでは主にいくつかの一般的なモジュールのpolyfill
が実装されている.extens(引き継ぎ)
javascript
には独自の継承機構がある.extensを実現するには、ソースオブジェクトのプロトタイプチェーンを汚染してはいけないと考える必要があります.Object.extend = Obj.extend || function(d, s, override) {
var keys = Object.keys(s);
for(var i = 0, len = keys.length; i < len; i++) {
var k = keys[i];
if(!d[k] || !!override) {
d[k] = s[k];
}
}
function _x() {this.constructor = d;}
_x.prototype = s.prototype;
d.prototype = new _x();
};
まず、s
オブジェクト自体の属copy
をd
オブジェクト(s
オブジェクトのプロトタイプチェーン上の属性を含まない)に与える.次にd
オブジェクトのプロトタイプをs
オブジェクトに移動します.注意したいのは、d
のプロトタイプオブジェクトに対して、後で ``s
オブジェクトのプロトタイプチェーンを修正するべきではないので、中間に隔離層を置くことです.後はこうやって使えます.function Drived(_super) {
_super.call(this);
//...
}
window.extend(Drived, super);
nodejsはすでに内蔵の実現があります.)bind(匿名関数)
私たちはjs関数の続きを知っています.
this
は動的に指定できます.bind
はとても使いやすい文法飴です.Function.prototype.bind = Function.prototype.bind || function() {
var func = this;
var args = [].slice.call(arguments);
var ctx = args.shift();
return function() {
func.apply(ctx, args.concat([].slice.call(arguments)));
}
};