bind的原生代码实现
2024-10-21 07:57:09
<script>
function foo(p1,p2) {
this.val = p1 + p2;
}
var bar = foo.bind(this, "p1");
//bar = fToBind.apply(this instanceof fNOP &&
//oThis ? this : oThis || window,
//aArgs.concat(Array.prototype.slice.call(arguments)));
var baz = new bar("p2");//(柯里化)new
console.log(baz.val);//p1p2
if (!Function.prototype.bind) {//为了判断浏览器是否支持bind()函数
Function.prototype.bind = function (oThis) {
if (typeof this !== 'function') {//因为call和apply的存在,可以将this指向其他对象,如foo.bind.call(obj),就是为了防止此情况的出现
throw new TypeError('调用者不是当前函数对象');
}
var aArgs = Array.prototype.slice.call(arguments, 1);//从传进的参数中截取第一个(this)参数后面的参数
fToBind = this,
fNOP = function () { },//这个的作用相当于事例对象的构造函数,because
fBound = function () {
return fToBind.apply(this instanceof fNOP && oThis ? this : oThis || window,//&&优先级高于?: 这里的this指向的是fBound
aArgs.concat(Array.prototype.slice.call(arguments)));
};
//this
instanceof
fNOP判断fNOP是否是this的构造函数,是为了确保是在原对象的基础上继续添加的参数
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}
</script>
最新文章
- Windows 7 下如何设置机器级别的DCOM权限
- iOS - Swift 与 C 语言交互编程
- 一款jQuery实现重力弹动模拟效果特效,弹弹弹,弹走IE6
- Socket的使用
- jitsi-meet
- iOS开发-相关文档
- 普通用户登录PLSQL后提示空白OK对话框错误
- 【计算几何初步-代码好看了点线段相交】【HDU2150】Pipe
- Android常见布局问题
- mysql 时间
- java 第三次作业
- STL初始化initializer_list
- spring boot 操作MySQL pom添加的配置
- 五、u-boot 启动流程---u-boot.lds
- Linux CentOS 7 &; JDK 1.7 安装与配置
- python里的字典和集合
- JDK提供的四种线程池
- NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用
- 常用sqoop操作
- java switch参数类型