Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs:在JavaScript中,类方法在默认情况下不绑定_Reactjs_Javascript - Fatal编程技术网

Reactjs:在JavaScript中,类方法在默认情况下不绑定

Reactjs:在JavaScript中,类方法在默认情况下不绑定,reactjs,javascript,Reactjs,Javascript,我在跟踪,我发现了这个: 在JavaScript中,默认情况下不绑定类方法。如果忘记绑定this.handleClick并将其传递给onClick,则在实际调用该函数时,该函数将未定义 我从这段引文中了解到,this并没有指定每个类方法中的当前实例化 但是,如果我考虑下面的代码,方法 EddieStase可以访问扩展类父< /代码>的属性状态 > < 。这将使前面的引语为假,因为此绑定到所有类方法 类父类{ 构造函数(){ this.state=false; } 设置状态(新闻状态){ th

我在跟踪,我发现了这个:

在JavaScript中,默认情况下不绑定类方法。如果忘记绑定this.handleClick并将其传递给onClick,则在实际调用该函数时,该函数将未定义

我从这段引文中了解到,
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