关于JS/TS的this对准问题(记录自己做错事)

原创
小哥 3年前 (2022-11-14) 阅读数 9 #大杂烩

前言

它的真正博主已经很久没有提及过它了。Ts代码, 所以最近我被这个基本问题搞糊涂了。


什么是this指针

在JavaScript在中创建函数, 系统隐式创建两个参数(1.this 2.arguments)
this重点是隐式关联调用函数的对象,我将在下面解释。


this据我所知,指针目前是, 分为四种情况

第一种:

函数方法通常被传递。"()"打电话,例如:twoSums(); 被称为twoSums方法, 在此功能中this指针指向window, 因为在这一点上,这个函数是。window A方法

第二种:

可以使用类中的方法。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指针的引用对象“函数上下文”。

至此, 一些结论引用文章:https://www.cnblogs.com/libinfs/p/5753560.html, 如有侵权,请联系 速删

个人遇到的问题

在我编写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 声明如何打开对象!
然而,这也是好的。在这个小问题的情况下, 让我回顾一下this的问题, 我希望大家看完后都能有所收获!

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除