前言

其实博主很久没有碰关于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 声明对象的打开方式!