- 文章
- 基于后缀算术表达式的代码解析
- 基于AST的算数表达式解析
- Vscode Java 环境配置
- 纯前端实现图片的模板匹配
- 测试用例管理工具Luckyframe安装
- Vscode远程开发,本地翻墙神器
- 记前端手写方法
- Node 2020年新增功能
- yum-404-error
- react16特性:fiber reconciler解密
- cmd终端设置代理
- 前端面试题收集
- git子模块
- 算法-排序
- linux安装python-pyenv环境
- 开发人员良心工具
- 斐波拉契数列js实现
- 数组ArrayFlatten
- Docker安装部署taiga项目
- 极光推送RN集成
- docker-pm2发布node服务
- git-pull获取指定文件
- git获取第一次commit提交记录
- ReactNative项目选型设计
- Docker-Mysql8.0安装及初始化配置
- DDA算法
- ubuntu搭建shadowsocks服务
- React-Native 接入百度统计SDK
- docker-使用yum安装
- 前端入门篇
- CodePush尝试
- Markdown数学公式
- Mongoose踩坑路
- linux系统nvm指定版本安装
- linux安装nginx
- Vscode-Threejs代码智能提示
- linux常用命令
- 说明
记前端手写方法
十二月 11, 2019call、apply、bind 实现
call、apply、bind 本质都是改变 this 的指向,不同点 call、aplly 是直接调用函数,bind 是返回一个新的函数。call 跟 aplly 就只有参数上不同。
bind 实现
- 箭头函数的 this 永远指向它所在的作用域
- 函数作为构造函数用 new 关键字调用时,不应该改变其 this 指向,因为 new 绑定 的优先级高于 显示绑定 和 硬绑定
Function.prototype.myBind = function (thisArg) {
if (typeof this !== "function") {
throw new Error("only can bind funtion");
}
const args = Array.prototype.slice.call(arguments, 1);
const _this = this;
const nop = function () {}; // 用于箭头函数
const bound = function () {
return _this.apply(
this instanceof nop ? this : thisArg,
args.concat(Array.prototype.slice.call(arguments))
);
};
if (this.prototype) {
nop.prototype = this.prototype;
}
bound.prototype = new nop();
return bound;
};
apply call 实现
Function.prototype.myCall = function (target) {
if (typeof this !== "function") {
throw new Error("error");
}
const args = Array.prototype.slice.call(arguments, 1);
target.fn = this;
const result = target.fn(...args);
delete target.fn;
return result;
};
Function.prototype.myApply = function (target) {
if (typeof this !== "function") {
throw new Error("error");
}
const args = arguments[1];
target.fn = this;
const result = target.fn(args);
delete target.fn;
return result;
};
const bar = function () {
console.log(this.name, arguments);
};
bar.prototype.name = "bar";
const foo = {
name: "foo",
};
bar.myCall(foo, 1, 2, 3); // foo [1, 2, 3]
bar.myApply(foo, [1, 2, 3]); // foo [1, 2, 3]
new 实现
我们需要知道当 new 的时候做了什么事情
创建一个新对象;
将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象)
执行构造函数中的代码(为这个新对象添加属性)
返回新对象。
function myNew(fn) {
const args = Array.prototype.slice.call(arguments, 1);
const o = {};
// 实现继承,实例可以访问构造器的属性
o.__proto__ = fn.prototype;
const result = fn.call(o, ...args);
return typeof result === "object" ? result : o;
}
const testNewFun = function (name) {
this.name = name;
};
const newObj = myNew(testNewFun, "foo");
console.log(newObj); // { name: "foo" }
console.log(newObj instanceof testNewFun); // true