React中constructor(props){}究竟是什么,以及super(props)与super()的区别

在React Class中设置state的初始值或者绑定事件时

为什么需要在 constructor(){} 中加上 super() 呢

我们尝试去掉 super() 看看编译的结果:

constructor() {

this.state = {searchStr: ''};

this.handleChange = this.handleChange.bind(this);

}
运行这段代码时,会发现编译错误:

提示没有在this之前加上super()

其实就是少了super(),导致了this的 Reference Error

class MyComponent extends React.Component {

constructor() {

console.log(this); // Reference Error

}


render() {

return <div>Hello {this.props.name}</div>;

}

}
super关键字,它指代父类的实例(即父类的this对象)。子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。

正确的姿势应该是这样

constructor() {

super();

this.state = {searchStr: ''};

this.handleChange = this.handleChange.bind(this);

}
React的官方例子中都是加上了 props 作为参数
constructor(props) {

super(props);

this.state = {searchStr: ''};

this.handleChange = this.handleChange.bind(this);

}
那它们的区别在哪儿呢

What's the difference between “super()” and “super(props)” in React when using es6 classes?

借用下stackoverflow上的解释

There is only one reason when one needs to pass props to super():

When you want to access this.props in constructor.

(Which is probably redundant since you already have a reference to it.)

意思是说

 

只有一个理由需要传递props作为super()的参数,那就是你需要在构造函数内使用this.props

那官方提供学习的例子中都是写成super(props),所以说写成super(props)是完全没问题的,也建议就直接这样写

<think>嗯,用户问的是JavaScript中super()super(props)区别,特别是在React中的使用。我需要先回忆一下相关的知识点。根据之前的引用资料,super()是用来调用父类的构造函数,这是ES6类继承的基本要求。在React组件中,如果不调用super(),就无法使用this,比如访问this.props或this.state会出错。 然后,super(props)super()区别在于是否传递props参数给父类的构造函数。如果只调用super(),那么在构造函数内部,this.props会是undefined,直到构造函数结束之后React才会把props赋值给实例。这时候如果在构造函数里访问this.props,就会出错。而调用super(props)的话,父类构造函数就能接收到props参数,这时候在构造函数里就可以使用this.props了。 需要解释清楚两者的使用场景。比如在React组件中,如果需要在构造函数里访问this.props,就必须调用super(props),否则只需要super()即可。另外,即使没有在构造函数中使用props,有些人还是习惯性地传入props,这样可能更保险,或者符合代码规范。 还要注意,React在组件实例化后会自动将props赋值给实例,所以即使没有在super中传递props,之后还是可以通过this.props访问。但这个过程是在构造函数执行之后发生的,所以构造函数内部如果没有传递的话,就不能提前使用。 然后要检查是否有其他相关点,比如在ES6中super的行为,是否必须在构造函数第一行调用super,是的,这是必须的。另外,super除了调用构造函数,还可以用来调用父类的方法,比如super.method(),但这里的问题主要集中在构造函数的使用上。 可能用户是React开发者,遇到了相关的错误,比如在构造函数里访问this.props发现是undefined,这时候就需要知道必须使用super(props)来解决这个问题。需要给出具体的例子来说明两者的区别,比如代码示例,调用super(props)之后可以在构造函数里访问this.props,而只调用super()则不行。 总结的时候要分点说明,明确区别和应用场景。同时需要引用提供的参考文献来支持回答,比如引用中的例子和解释。确保回答符合用户的需求,结构清晰,步骤分明,帮助用户理解根本原因和解决方法。</think>在JavaScript中,`super()`和`super(props)`的区别主要体现在类继承的上下文和参数传递上,尤其是在React组件中的应用场景更为关键。以下是具体分析: --- ### 1. **基础定义** - **`super()`**:调用父类的构造函数,是ES6类继承的必要操作。若不调用,子类无法通过`this`访问父类的属性和方法[^3][^4]。 - **`super(props)`**:在调用父类构造函数时,额外将`props`参数传递给父类。这对React组件尤为重要,因为它决定了构造函数中是否能访问`this.props`[^1][^5]。 --- ### 2. **在React中的核心区别** | **场景** | `super()` | `super(props)` | |-----------------------|------------------------------------------|-----------------------------------------| | **`this.props`访问时机** | 构造函数内`this.props`为`undefined` | 构造函数内可直接访问`this.props`[^5] | | **参数传递** | 父类构造函数未接收`props`参数 | 父类构造函数接收到`props`参数 | | **典型错误** | `TypeError: Cannot read property 'props'` | 无 | --- ### 3. **代码示例对比** ```javascript // 仅调用super() class MyComponent extends React.Component { constructor(props) { super(); // 未传递props console.log(this.props); // undefined(此时props还未绑定到this) } } // 调用super(props) class MyComponent extends React.Component { constructor(props) { super(props); // 传递props console.log(this.props); // 正常输出props } } ``` --- ### 4. **关键结论** 1. **何时用`super()`**: - 如果子类构造函数中**不依赖`this.props`**(例如不初始化状态或绑定事件),可简写为`super()`。 - React会在构造函数执行后自动将`props`附加到实例[^1]。 2. **必须用`super(props)`的情况**: - 需要在构造函数中**直接使用`this.props`**(如根据props初始化状态)。 - 需要**在父类构造函数中处理`props`**(例如自定义父类逻辑)[^5]。 --- ### 5. **常见误区** - **`super()`和`super(props)``this.state`的关系**: 即使未传递`props`,仍可通过`this.state = { value: props.value }`初始化状态,因为`props`已作为参数传入构造函数[^2]。 - **React的自动处理**: React会在实例化后自动将`props`绑定到组件,因此`super()`的省略仅影响构造函数内部,不影响组件生命周期方法(如`render`)中的`this.props`[^1]。 --- ### 相关问题 1. **为什么React组件构造函数需要调用`super()`?** 2. **如何在子类中覆盖父类方法时使用`super`?** 3. **如果忘记写`super(props)`,React会抛出什么错误?** 4. **ES6类继承中`super`的语法规则是什么?** --- 通过理解参数传递的机制和React的实例化流程,可以更灵活地选择`super()`或`super(props)`,避免因上下文依赖导致的错误[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值