Polyfill
2015-08-27 10:26
986 查看
javascript由于各种历史原因以及前端界典型的激进的特点,导致一些好的设计和模块不能够在各种平台上运行,(这里各种平台主要指的是各巨头的浏览器加上进年火的不行的Nodejs。)但是程序员需要为其埋单,程序员需要去了解各种模块的polyfill,小到一些函数如:
Object.sign,
extend,
clone等。大的模块有,
Seajs、
Requirejs这类文件模块加载模块,
Promise这类担负着解决
callback hell的模块。只要工程实践上有需要,但是没有被主流平台实现,我们就必须去实现它。幸运的是,这是一个开源的好时代。一些模块在
github上都能找到。这里主要实现几个常用模块的
polyfill。
extends(继承)
javascript有其独特的继承机制。在实现extends的时候需要考虑不能污染了源对象的原型链。
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))); } };
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- JavaScript拆分字符串时产生空字符的原因
- IE8开发人员工具教程(二)
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- 在flex中执行一个javascript方法的简单方式
- Flex结合JavaScript读取本地路径的方法
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- PowerShell中执行Javascript的方法示例
- javascript asp教程第六课-- response方法