TypeScript直接运行某个类的指定方法

问题

TypeScript在配置表需要直接配置某个类的指定方法。比如[“ClassA”,“Show”]代表ClassA.Show()。


代码如下


class ClassA {
	private m_value: number = 0;

	private static s_name: string = "";

	public static Show() {
		this.s_name = "l2xin";
		console.log("ClassA.Show():", this)
		ClassA.Init();
	}

	public static ShowFunc = function () {
		this.s_name = "l2xin";
		console.log("ClassA.ShowFunc():", this)
		ClassA.Init();
	}

	private SetValue() {
		this.m_value = 2;
	}

	private static Init() {

	}
}


测试代码

function Test() {
	let a: ClassA = new ClassA();

	let myClass = window["ClassA"];

	//ShowFunc中this为ClassA
	myClass.Show();

	//ShowFunc中this为ClassA
	myClass.ShowFunc();

	/**使用字符串获得方法 */

	let func: Function = myClass["Show"];
	//func执行时this为window
	func();

	//执行时this为ClassA 正常
	func.call(myClass);
}

测试结果

  • myClass.Show();

  • myClass.ShowFunc();

  • let func: Function = myClass["Show"]; func.call(myClass);

    ClassA.Show(): ƒ ClassA() {
        this.m_value = 0;
    }
    
  • let func: Function = myClass["Show"]; func();

    ClassA.Show(): Window
    

前三种执行的结果都和预期相符,函数中的this都是ClassA。
最后一种func()中this代表的是Window。


分析

Ts和Js在一个方法中(如果是ts,这里仅限于非lambda表达式定义的方法)有使用this关键字,那么可以按照下面的优先级顺序来推断this指向的是什么:

  • 如果这个函数是function#bind调用的结果,那么this指向的是传入bind的参数
  • 如果函数是以foo.func()形式调用的,那么this值为foo
  • 直接func(),如果是在严格模式下,this将为undefined,否则,this将是全局对象(浏览器环境里为window)

详细文档看这里:
Understanding JavaScript Function Invocation and “this”

综上,我理解Ts的this是这样:

  • 调用x.func();则 func()中this就是x,
  • 如果是匿名函数或者把函数类型变量,即let myFunc = x.func; myfunc中的this则根据上下文来决定,全局就为window。

对比lua的self.func() self:func()还有python的面向对象理解起来更有意思。


其他

下面这两种实现都可以满足需求

  • public static ShowFunc = function () {}

  • public static Show() {}

个人推荐使用第二种,Class内部实现会比较自然。

    let func: Function = myClass["Show"]; 
    func.call(myClass);

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue 3和TypeScript中获取当前经纬度可以通过浏览器的Geolocation API来实现。下面是一个简单的示例代码: 首先,你需要在Vue组件中引入Geolocation API: ```typescript import { ref, onMounted } from 'vue'; export default { setup() { const latitude = ref<number | null>(null); const longitude = ref<number | null>(null); onMounted(() => { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( (position) => { latitude.value = position.coords.latitude; longitude.value = position.coords.longitude; }, (error) => { console.error(error); } ); } else { console.error('Geolocation is not supported by this browser.'); } }); return { latitude, longitude, }; }, }; ``` 在上述代码中,我们使用了Vue 3的Composition API来定义了两个响应式变量`latitude`和`longitude`,并在组件的`onMounted`生命周期钩子中调用了`navigator.geolocation.getCurrentPosition`方法来获取当前位置的经纬度信息。 注意,由于获取位置信息是一个异步操作,所以我们使用了回调函数来处理成功和失败的情况。如果获取成功,我们将经纬度信息分别赋值给`latitude`和`longitude`变量;如果获取失败,我们将错误信息打印到控制台。 最后,在模板中可以通过`latitude`和`longitude`变量来展示当前的经纬度信息: ```html <template> <div> Latitude: {{ latitude }} Longitude: {{ longitude }} </div> </template> ``` 这样,当组件被挂载到页面上时,它会尝试获取当前位置的经纬度,并将结果显示在模板中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值