前言
其实博主很久没有碰关于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方法指定的对象。
第四种
作为构造器进行调用
function 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) {
return 0;
}
return this.age > b.age ? 1 : -1;
}
check(): void{
console.log(this.age);
}
}
const result = MyObject.prototype.compareTo(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) {
return 0;
}
return this.age > b.age ? 1 : -1;
}
check(): void{
console.log(this.age);
}
}
// var myObj = new MyObject(0);
var myObj = new MyObject();
const result = myObj.compareTo(Person);
myObj.check();
console.log(result);
这里是明确声明了 一个对象 myObj, 所以this指向的问题就解决了 , 可以直接获取age的值 42;
总结
其实这里主要原因是我起初 写的是MyObj m = new MyObject(); 忘记了这个是Java用来声明对象的方法, 当时ts报错 我还纳闷怎么可能不好使, 后来就用的原型调用方法。 然后就忘记了, 就开始纠结this指向的问题了。
var myObj = new MyObject(); -> 这才是 ts 声明对象的打开方式!