01|安全类型检测
const isArray = value=>Object.prototype.toString.call(value)==="[object Array]"
const isFunction = value=>Object.prototype.toString.call(value)==="[object Function]"
02|函数绑定
函数绑定要创建一个函数,可以在特定的 this 环境中以指定参数调用另一个函数
function bind(fn, context){
return function(){
return fn.apply(context, arguments);
};
}
03|函数柯里化
用于创建已经设置好了一个或多个参数的函数
function curry(fn){
let args = Array.prototype.slice.cal(arguments,1);
return function(){
let innerArgs = Array.prototype.slice.call(arguments);
let finalArgs = args.concat(innerArgs);
return fn.apply(null,finalArgs);
}
}
04|防止篡改对象
// 不可扩展对象,使用该方法可以让传入的对象禁止添加属性和方法
Object.preventExtensions(obj);
// 使用Object.isExtensible(obj)可以判断对象是否可扩展
Object.isExtensible(obj);
// 密封的对象,不可扩展,不能删除,但可以修改
object.seal(obj);
// 使用Object.isSealed()可以确定对象是否密封
Object.isSealed(obj);
// 冻结的对象,不可扩展,密封,不能修改,访问器属性可写
Object.freeze(obj);
05|高级定时器
// 函数节流
function throttle(method,context){
clearTimeout(method.tId);
method.tId = setTimeout(function(){
method.call(context);
}, 100)
}
06|自定义事件
function EventTarget(){
this.handlers = {};
}
EventTarget.prototype = {
constructor: EventTarget,
addHandler: function(type, handler){
if(typeof this.handlers[type] == "undefined"){
this.handlers[type] = [];
}
this.handlers[type].push(handler);
},
fire: function(event){
if(!event.target){
event.target = this;
}
if(this.handlers[event.type] instanceof Array){
var handlers = this.handlers[event.type];
for(var i=0,len=handlers.length;i<len;i++){
handlers[i](event);
}
}
},
removeHandler: function(type, handler){
if(this.handlers[type] instanceof Array){
var handlers = this.handlers[type];
for(var i=0, len=handlers.length; i<len; i++){
if(handlers[i] === handler){
break;
}
}
handlers.splice(i, 1);
}
}
}