super() 在没有任何参数的情况下做什么?

IT技术 javascript reactjs ecmascript-6 super
2021-05-16 01:05:27

我正在从docs学习 react ,但不确定super()这个例子中的作用。通常情况下,不是将传入的参数用于创建新实例,然后调用 React.Component 的构造函数方法将这些参数合并到实例中吗?没有任何参数它会做什么?

class LikeButton extends React.Component {
  constructor() {
    super();
    this.state = {
      liked: false
    };
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick() {
    this.setState({liked: !this.state.liked});
  }
  render() {
    const text = this.state.liked ? 'liked' : 'haven\'t liked';
    return (
      <div onClick={this.handleClick}>
        You {text} this. Click to toggle.
      </div>
    );
  }
}

ReactDOM.render(
  <LikeButton />,
  document.getElementById('example')
);
2个回答

在 ES6 中,派生类super()如果有构造函数就必须调用在 React 中,所有组件都从 Component 类扩展而来。

您实际上并不需要为每个 ES6/react 类提供构造函数。如果未定义自定义构造函数,它将使用默认构造函数对于基类,它是:

constructor() {}

对于派生类,默认构造函数是:

constructor(...args) {
  super(...args);
}

您还需要super()在访问之前调用this,因为在调用之前this不会初始化super()

在 React 中使用自定义构造函数有几个原因。一种是您可以使用this.state = ...而不是使用getInitialState生命周期方法在构造函数中设置初始状态

您还可以使用this.someClassMethod = this.someClassMethod.bind(this). 在构造函数中绑定方法实际上更好,因为它们只会被创建一次。否则,如果您调用bind或使用箭头函数在构造函数之外的任何位置绑定方法(如在render方法中),它实际上最终会在每次渲染时创建函数的新实例。在此处阅读更多相关信息

如果要this.props在构造函数中使用,则需要以superprops 为参数调用:

constructor(props) {
  super(props);
  this.state = {count: props.initialCount};
}

如果不这样做,则this.props在构造函数中未定义。但是,您仍然可以this.props在构造函数之外访问类中的任何其他位置,而无需在构造函数中对其进行任何操作。

superJavaScript 中关键字用于调用父类的方法。本身,super()在构造函数中用于调用父构造函数。例如:

class Animal {
  
  constructor(age) {
    console.log('Animal being made');
    this.age = age;
  }
  
  returnAge() {
    return this.age;
  }
  
}

class Dog extends Animal {

  constructor (age){
    super(age);
  }
  
  logAgeDog () {
    console.log(`This dog is: ${ super.returnAge()} years old`);
  }
  
}

const dog = new Dog(5);


console.log(dog);

dog.logAgeDog();

在这个例子中,我们有一个 Dog 类,它extends是一个 Animal 类。Dog 类使用super关键字两次。第一次出现在构造函数中,super()在构造函数中使用时会调用父类的构造函数。因此,我们必须将 age 属性作为参数。现在 Dog 成功地拥有了 age 属性。

我们还可以super在构造函数之外使用以访问父类的“类”(即原型)属性和方法。我们在logAgeDog位于 Dog 类函数中使用它我们使用以下代码:

super.returnAge();

你应该把它读成:

Animal.returnAge();     // superClass.returnAge()

为什么我在 React 中需要这个?

只有在实现构造函数时super()需要React 中关键字您必须执行以下操作:

constructor(props) {
  super(props);
  // Don't call this.setState() here!
}

被命名的父类Component需要自己做一些初始化,以便 React 正常工作。如果您在没有super(props)调用的情况下实现构造函数this.propsComponent将会undefined导致错误。