关于JSTS的this指向问题(记录⾃⼰犯错)
前⾔
其实博主很久没有碰关于Ts的代码了, 所以最近⼀写就被⽐较基础的问题搞糊涂了⼀下。
什么是this指针
在JavaScript中,创建函数, 系统会隐式创建两个参数(1.this 2.arguments)
this的指向是隐式关联⼀个调⽤函数的对象,下⾯我会⼀⼀说明
this指针⽬前据我的了解,分为四种情况
第⼀种:
函数⽅法⼀般通过"()"调⽤,例如:twoSums(); 就是调⽤了twoSums⽅法, 此时函数内的this指针指向window, 因为此时这个函数是作为window 的⼀个⽅法出现的
第⼆种:
⼀个类中⽅法可以使⽤this指向调⽤此⽅法拥有者(对象)的属性。 如果被调⽤, 则指向调⽤者对象。
第三种:
call(), apply() ⽅法进⾏⾃定义this指向
function getName(age,sex){
console.log(this.name);
this.age = age;
this.sex = sex;
}
var jenny ={ name : jenny };
getName.call(jenny,24,female);
getName.apply(jenny,[24,female]);
//jenny
可见这两种调⽤⽅式的唯⼀区别在于,传⼊参数的形式,call⽅法依次写⼊参数,⽽apply⽅法则将所需传⼊函数的参数打包为⼀个数组统⼀传⼊。
⽽这两种⽅法在做的事为,将函数内部的隐式this参数指向其第⼀个参数,并将其后的参数传⼊⾄函数中,调⽤函数。
因此,在此种情况下,函数内部的this指针指向call与apply⽅法指定的对象。
第四种
作为构造器进⾏调⽤
js argumentsfunction Person(name,age){
this.name = name;
this.age = age;
}
var jenny =new Person('jenny',24);
console.log(jenny.name);//jenny
构造函数的调⽤,返回值即为⼀个对象,⽽这个对象即为构造函数作⽤域内this指针的引⽤对象,即“函数上下⽂”。
个⼈遇到的问题
在我编写Ts时
原来我是这么写的
const Person ={ age:4};
interface Comparable {
compareTo(b: any): number;
}
class MyObject implements Comparable {
age =42;
compareTo(b: any): number {
console.log(this.age);
console.log(b.age);
if(this.age === b.age){
return0;
}
return this.age > b.age ?1:-1;
}
check():void{
console.log(this.age);
}
}
const result = MyObject.prototypepareTo(Person);
MyObject.prototype.check();
console.log(result);
这⾥得到的 this.age 是 undefined, 是因为并没有对象调⽤此⽅法, 因为这⾥⽤的prototype原型调⽤的, 所以这⾥ this.age只能 对其赋值 或者 操作, 是没有办法获取它的值的
正确写法如下:
const Person ={ age:4};
interface Comparable {
compareTo(b: any): number;
}
class MyObject implements Comparable {
age =42;
// constructor(age: number){
// this.age = age;
// }
compareTo(b: any): number {
console.log(this.age);
console.log(b.age);
if(this.age === b.age){
return0;
}
return this.age > b.age ?1:-1;
}
check():void{
console.log(this.age);
}
}
// var myObj = new MyObject(0);
var myObj =new MyObject();
const result = myObjpareTo(Person);
myObj.check();
console.log(result);
这⾥是明确声明了 ⼀个对象 myObj, 所以this指向的问题就解决了 , 可以直接获取age的值 42;
总结
其实这⾥主要原因是我起初 写的是MyObj m = new MyObject(); 忘记了这个是Java⽤来声明对象的⽅法, 当时ts报错 我还纳闷怎么可能不好使, 后来就⽤的原型调⽤⽅法。 然后就忘记了, 就开始纠结this指向的问题了。
var myObj = new MyObject(); -> 这才是 ts 声明对象的打开⽅式!
不过也不错,遇到这个⼩问题, 正好让我复习了⼀边this的问题, 希望⼤家看完也能有所收获!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论