Reactjs:在JavaScript中,类方法在默认情况下不绑定
我在跟踪,我发现了这个: 在JavaScript中,默认情况下不绑定类方法。如果忘记绑定this.handleClick并将其传递给onClick,则在实际调用该函数时,该函数将未定义 我从这段引文中了解到,Reactjs:在JavaScript中,类方法在默认情况下不绑定,reactjs,javascript,Reactjs,Javascript,我在跟踪,我发现了这个: 在JavaScript中,默认情况下不绑定类方法。如果忘记绑定this.handleClick并将其传递给onClick,则在实际调用该函数时,该函数将未定义 我从这段引文中了解到,this并没有指定每个类方法中的当前实例化 但是,如果我考虑下面的代码,方法 EddieStase可以访问扩展类父< /代码>的属性状态 > < 。这将使前面的引语为假,因为此绑定到所有类方法 类父类{ 构造函数(){ this.state=false; } 设置状态(新闻状态){ th
this
并没有指定每个类方法中的当前实例化
但是,如果我考虑下面的代码,方法<代码> EddieStase<代码>可以访问扩展类<代码>父< /代码>的属性<代码>状态<代码> > <代码> < <代码>。这将使前面的引语为假,因为
此
绑定到所有类方法
类父类{
构造函数(){
this.state=false;
}
设置状态(新闻状态){
this.state=newState;
}
}
类子级扩展父级{
编辑状态(){
此.setState(true);
}
}
让c=新孩子;
c、 编辑状态();
console.log(c.state)代码>当函数用作事件处理程序时,其“this”被设置为从中激发事件的元素。
我认为React文档可能有误导性。MyClass
下面的React组件是React.component
的派生类(又称子类)。constructor
方法是javascript ES6中的一种特殊方法,用于创建和初始化使用类创建的对象。React在创建对象时使用构造函数将props
传递给组件。基类(也称为父类)被创建并绑定到它们自己的this
,但是默认情况下派生类没有它们自己的this
。派生类必须调用super(props),它将this
从基类绑定到派生类中
class MyClass extends React.Component{
constructor(props) {
super(props)
}
}
以下是由用户376830提供的答案中的相关信息。这直接来自javascript文档
类上下文
这个
在类和函数中的行为是相似的,因为类是隐藏的函数。但也存在一些差异和警告
在类构造函数中,这是一个常规对象。类中的所有非静态方法都添加到this
的原型中:
class Example {
constructor() {
const proto = Object.getPrototypeOf(this);
console.log(Object.getOwnPropertyNames(proto));
}
first(){}
second(){}
static third(){}
}
new Example(); // ['constructor', 'first', 'second']
注意:静态方法不是此
的属性。它们是类本身的属性
派生类
与基类构造函数不同,派生构造函数没有初始绑定。调用super()
this=newbase()代码>
警告:在调用super()
之前引用此选项将引发错误
派生类在调用super()
之前不得返回,除非它们返回对象或根本没有构造函数
class Base {}
class Good extends Base {}
class AlsoGood extends Base {
constructor() {
return {a: 5};
}
}
class Bad extends Base {
constructor() {}
}
new Good();
new AlsoGood();
new Bad(); // ReferenceError
默认情况下不绑定意味着,当您将方法作为事件的回调(例如,onClick={this.editState}
时,onClick
事件将您的函数与另一个上下文绑定,除非您在(this.editState=this.editState.bind(this))之前明确地将您的方法与正确的上下文绑定
在构造函数中或使用箭头函数)。因此,当您自己调用editState时,通常可以访问this
。