在js的class类中,this的执行

32 阅读3分钟

1.在js的class类中,this的执行

在JavaScript的类中,this的执行取决于调用方法的方式。在类中,通常会使用this关键字来引用当前实例的属性和方法。下面我将解释一下在不同情况下this的执行:

  1. 在类的构造函数中: 在类的构造函数中,this指向正在创建的实例。例如:
class MyClass {
  constructor(name) {
    this.name = name;
  }
}

const myObject = new MyClass('example');
console.log(myObject.name); // 输出:example
  1. 在类的方法中: 在类的方法中,this指向调用该方法的对象。例如:
class MyClass {
  constructor() {
    this.name = 'MyClass';
  }

  printName() {
    console.log(this.name);
  }
}

const myObject = new MyClass();
myObject.printName(); // 输出:MyClass
  1. 在事件处理程序中: 在事件处理程序中,this的指向取决于事件的触发方式。通常情况下,this会指向触发事件的元素。为了确保this指向类的实例,可以使用箭头函数来定义事件处理程序。例如:
class MyClass {
  constructor() {
    this.name = 'MyClass';
    document.getElementById('myButton').addEventListener('click', () => {
      console.log(this.name);
    });
  }
}

const myObject = new MyClass();

总的来说,在JavaScript的类中,this的执行取决于上下文。通过了解调用方法的方式以及如何定义函数,可以更好地控制this的指向。

2.调用class类中方法用箭头函数定义,方法调用,添加括号和不添加括号这个this的指定

当使用箭头函数定义类中的方法时,箭头函数会继承父级作用域的this,而不会创建自己的this。这意味着无论是否添加括号,箭头函数内部的this都会指向箭头函数被定义时的this。让我们通过一个示例来说明这一点:

class MyClass {
  constructor() {
    this.name = 'MyClass';
  }

  printName = () => {
    console.log(this.name);
  }
}

const myObject = new MyClass();

// 添加括号,箭头函数内部的this仍然指向myObject
myObject.printName(); // 输出:MyClass

// 不添加括号,箭头函数内部的this仍然指向myObject
const printFunction = myObject.printName;
printFunction(); // 输出:MyClass

在上面的示例中,我们使用箭头函数定义了printName方法。无论是直接调用myObject.printName()还是将方法赋值给printFunction并调用printFunction(),箭头函数内部的this始终指向myObject,因此成功输出了MyClass

因此,当使用箭头函数定义类中的方法时,不需要担心this指向的问题,它会始终指向正确的对象。

3.调用class类中方法调用,添加括号和不添加括号这个this的指定

在JavaScript中,调用类中的方法时,添加括号和不添加括号会影响this的指向。具体来说,如果你直接调用类中的方法并添加括号,this会指向调用该方法的对象;如果不添加括号,this会指向类的实例。让我们通过一个示例来说明这一点:

class MyClass {
  constructor() {
    this.name = 'MyClass';
  }

  printName() {
    console.log(this.name);
  }
}

const myObject = new MyClass();

// 添加括号,this指向调用该方法的对象
myObject.printName(); // 输出:MyClass

// 不添加括号,this指向类的实例
const printFunction = myObject.printName;
printFunction(); // 输出:undefined(因为this指向了全局对象,而全局对象中没有name属性)

在上面的示例中,当我们使用myObject.printName()调用方法时,this指向myObject,因此成功输出了MyClass。而当我们将printName方法赋值给printFunction并调用printFunction()时,this指向了全局对象(在浏览器中是window对象),因此输出了undefined

因此,在调用类中的方法时,要根据具体情况来决定是否添加括号,以确保this指向正确的对象。