用apply把document当作this传入getId函数,帮助“修正”this;

document.getElementById = (function (func) {
return function () {
return func.apply(document, arguments);
}
})(document.getElementById); //调用
var getId = document.getElementById;
var div = getId('div2');

类型判断

var Type = {};

for (var i = 0, type; type = ['String', 'Array', 'Number'][i++];) {

    (function (type) {
Type['is' + type] = function (obj) {
return Object.prototype.toString.call(obj) === '[object ' + type + ']';
}
})(type); };

自定义事件(一):

var Event = {
_listeners: {},
// 添加
addEvent: function(type, fn) {
if (typeof this._listeners[type] === "undefined") {
this._listeners[type] = [];
}
if (typeof fn === "function") {
this._listeners[type].push(fn);
}
return this;
},
// 触发
fireEvent: function(type) {
var arrayEvent = this._listeners[type];
if (arrayEvent instanceof Array) {
for (var i=0, length=arrayEvent.length; i<length; i+=1) {
if (typeof arrayEvent[i] === "function") {
arrayEvent[i]({ type: type });
}
}
}
return this;
},
// 删除
removeEvent: function(type, fn) {
var arrayEvent = this._listeners[type];
if (typeof type === "string" && arrayEvent instanceof Array) {
if (typeof fn === "function") {
// 清除当前type类型事件下对应fn方法
for (var i=0, length=arrayEvent.length; i<length; i+=1){
if (arrayEvent[i] === fn){
this._listeners[type].splice(i, 1);
break;
}
}
} else {
// 如果仅仅参数type, 或参数fn邪魔外道,则所有type类型事件清除
delete this._listeners[type];
}
}
return this;
}
};

自定义事件(二):

//自定义事件

var Event=(function () { 

    var global=this,
Event,
_default='default'; Event=function () {
var _listen,
_trigger,
_remove,
_slice=Array.prototype.slice,
_shift=Array.prototype.shift,
_unshift=Array.prototype.unshift,
namespaceCache={},
_create,
find,
each=function (ary,fn) {
var ret;
for (var i = 0, l=ary.length; i < l; i++){
var n=ary[i];
ret=fn.call(n,i,n);
}
return ret;
};
//添加监听事件,并缓存
_listen = function (key,fn,cache) {
if(!cache[key]){
cache[key]=[];
}
cache[key].push(fn);
};
//移除监听
_remove=function (key,cache,fn) {
if(cache[key]){ //如果存在该监听事件
if(fn){ //如果存在回调函数
for (var i = cache[key].length; i >=0; i--){
if(cache[key][i]===fn){
cache[key].splice(i,1); //移除此回调函数
}
}
}else{
cache[key]=[]; //清除此事件(为什么存在回调函数时不执行此步骤,奇怪)
}
}
}; //触发事件
_trigger=function () {
var cache = _shift.call(arguments), //第一个参数是cache
key = _shift.call(arguments), //第二个参数是key
args = arguments,
_self = this,
ret,
stack= cache[key]; if(!stack || !stack.length){ //没有回调函数则直接返回
return;
} return each(stack, function () { //执行所有的回调函数
return this.apply(_self,args);
}); };
//创建事件的实例
_create=function (namespace) {
var namespace = namespace || _default;
var cache ={},
offlineStack=[], //离线事件
ret={
listen:function (key,fn,last) {
_listen(key,fn,cache);
if(offlineStack===null){
return;
}
if(last==='last'){
offlineStack.length && offlineStack.pop()(); //如果是最后一个离线事件,触发此离线事件并移除此事件
}else{
each(offlineStack,function(){ //如果是多个离线事件,并遍历触发
this();
});
} offlineStack = null; 清空离线事件
},
//执行一次监听事件
one:function (key,fn,last) {
_remove(key,cache); //此缓存中移除此事件
this.listen(key,fn,last); //添加此事件
},
remove:function (key,fn) {
_remove(key,cache,fn);
},
trigger:function () {
var fn,
args,
_self=this; _unshift.call(arguments,cache); //将cache缓存添加到arguments参数集合中
args=arguments;
fn=function(){
return _trigger.apply(_self,args);
}; if(offlineStack){
return offlineStack.push(fn);
}
return fn(); //触发事件
} }; return namespace ?
(namespaceCache[namespace] ? namespaceCache[namespace]:
namespaceCache[namespace]= ret )
:ret;
}; return {
create: _create,
one: function (key, fn, last) {
var event = this.create();
event.one(key, fn, last);
},
remove: function (key, fn) {
var event = this.create();
event.remove(key, fn);
},
listen: function (key, fn, last) {
var event = this.create();
event.listen(key, fn, last);
},
trigger: function () {
var event = this.create();
event.trigger.apply(this,arguments);
}
}; }(); return Event; })();

方法绑定:

Function.prototype.bind = function () {
var self = this,
context = [].shift.call(arguments),
args = [].slice.call(arguments); return function () {
return self.apply( context, [].concat.call(args, [].slice.call(arguments)) )
}
}

AOP:

Function.prototype.before = function(beforefn) {
var _self = this;
return function() {
beforefn.apply(this, arguments);
return _self.apply(this, arguments);
}
} Function.prototype.after = function(afterfn) {
var _self = this;
return function() {
var ret = _self.apply(this, arguments);
afterfn.apply(this, arguments);
return ret;
}
}

最新文章

  1. Key/Value之王Memcached初探:一、掀起Memcached的盖头来
  2. Res_Orders_02
  3. IE8上传文件时文件本地路径变成&quot;C:\fakepath\&quot;的问题
  4. HTML5 canvas绘制雪花飘落动画(需求分析、知识点、程序编写分布详解)
  5. Linux ps aux指令詳解--转
  6. tableview 编辑状态设置
  7. Oracle EBS-SQL (WIP-12):总装车间任务查询.sql
  8. ceph伦理概念
  9. Android应用开发基础篇(1)-----Button
  10. RTB撕开黑盒子 Part 2: Algorithm Meets World
  11. 使用 Premiere 制作视频简介
  12. [paper reading] C-MIL: Continuation Multiple Instance Learning for Weakly Supervised Object Detection CVPR2019
  13. Linux 互斥锁
  14. Effective Java 第三版——64. 通过对象的接口引用对象
  15. 何谓domReady
  16. python Count类(转)
  17. Tsql 获取服务器信息
  18. LintCode 395: First Will Win 2
  19. modprobe
  20. URAL 1997 Those are not the droids you&#39;re looking for

热门文章

  1. influxdb 配置文件注释
  2. php获取图片RGB颜色值的例子
  3. ios日期格式转换
  4. 菜鸟教程之工具使用(三)——Maven自动部署到Tomcat
  5. .NET MVC下的日志文件生成法
  6. angular-resource版本差异问题
  7. C++11 override和final
  8. ubuntu中gitlab搭建
  9. 【转帖】(一)unity4.6Ugui中文教程文档-------概要
  10. 【ARM】2440裸机系列-RTC数字时钟