当前位置:网站首页>Typescript类方法this指针绑定
Typescript类方法this指针绑定
2022-07-28 21:36:00 【RemoteDev】
//类的this指针使用
class Log{
constructor() {
//为printX函数绑定当前类对象,解决调用this.print时找不到print方法
this.printX = this.printX.bind(this);
//通过箭头函数形式使this指针自动绑定方法
this.printY = ((y='y') => {
this.print(`this allow auto bind this,${y}`);
});
}
print(obj){
console.log(obj);
}
printX(x='a'){
this.print(`hi,${x}`);//使用了this指针
}
printY(x='a'){
this.print(`bind test :,${x}`);//使用了this指针
}
}
let l = new Log();
l.printX('HELLO');//可正常调用
//导出形式调用报错
const {printX,printY}=l;//从对象中导出
//printX调用的print方法找不到,this失效
//printX('WOW');//Cannot read properties of undefined (reading 'print')
//通过绑定this的形式解决,上面的构造函数中添加了函数绑定this对象
console.log('printX方法已绑定this指针,问题解决');
printX('WOW');
console.log('printY方法通过箭头函数自动绑定this指针,问题解决');
printY('===world===');
//通过代理器在获取函数方法时自动绑定this
function proxyAutoBindThis(obj){
let c = new WeakMap();//缓存
//代理器处理事件
let h = {
get (t,k){
let v = Reflect.get(t,k);
if (typeof v!=='function'){return v;}//不是函数不处理,直接返回
if (!c.has(v)){c.set(v,v.bind(t));}//不重复绑定
return c.get(v);//返回绑定了this的函数
}
};
let p = new Proxy(obj,h);//为传入的obj设置代理器
return p;//返回代理器对象
}
class A{
test(obj){
console.log(obj);
}
test1(obj=null){
this.test(`${obj}===>,test1`);//使用this指针
}
test2(obj=null){
this.test(`${obj}===>,test2`);//使用this指针
}
}
let a = new A();//实例化A对象a
let objBindThisByProxy = proxyAutoBindThis(a);//所有方法自动绑定this
let {test1,test2}=objBindThisByProxy;//从代理器导出
//类对象调用
a.test1('类对象调用');
a.test2('类对象调用');
//通过代理器调用
test1('通过代理器调用');
test2('通过代理器调用');边栏推荐
- Sqlilabs-2 (breakthrough record)
- 《MySQL数据库进阶实战》读后感(SQL 小虚竹)
- Basic concept of MySQL database and deployment of MySQL version 8.0 (I)
- WebApplicationType#deduceFromClasspath
- View APK signature
- Is 1E3 a floating point number?
- Sqlilabs-1 (breakthrough record)
- [copy] Internet terms, abbreviations, abbreviations
- 无代码开发平台管理后台入门教程
- Empowering Chinese core entrepreneurs! See how Moore elite solves the development problems of small and medium-sized chip Enterprises
猜你喜欢

MySQL数据库的基本概念以及MySQL8.0版本的部署(一)

Improvement 11 of yolov5: replace backbone network C3 with lightweight network mobilenetv3

Nacos配置热更新的4种方式、读取项目配置文件的多种方式,@value,@RefreshScope,@NacosConfigurationProperties

安全狗入选《云安全全景图2.0》多个细项

Advanced C language: pointer (3)

业界首创云原生安全检测双模型!安全狗重磅报告亮相数字中国建设峰会

Sqlilabs-3 (entry notes)

MySQL常用的日期时间函数

无代码开发平台通讯录导出入门教程

Sdwebimage source code combs 5 author motivation, modifies directory, and changes inheritance relationship
随机推荐
pgbench基准测试《postgresql》
DirectX repair tool download (where is exagear simulator package)
cannot resize variables that require grad
Record a question about the order of trigonometric function exchange integrals
PCA学习
Improvement 17 of yolov5: cnn+transformer -- integrating bottleneck transformers
6 个超级良心的开源教程!
High quality subroutine 1
leetcode 199. 二叉树的右视图
歌尔股份与上海泰矽微达成长期合作协议!专用SoC共促TWS耳机发展
It's settled! All products of Nezha s will be launched on July 31
[database]
Wheel 6: qserialport serial port data transceiver
Summary of koltin knowledge points
Leetcode 199. right view of binary tree
MySQL foundation - advanced functions
美国FCC提供16亿美元资助本国运营商移除华为和中兴设备
Sdwebimage source code comb 4 # introduce several usages of existing code
Thesis reading (0) - alexnet of classification
(important) first knowledge of C language -- function