从docs学习反应并遇到了这个例子:
class Square extends React.Component {
constructor() {
super();
this.state = {
value: null,
};
}
...
}
根据Mozilla,super允许您在构造函数中使用this
。是否有任何其他理由使用独立super
(我知道super
允许您访问父类的方法)但是使用React还有任何其他用例只需调用{ {1}}本身?
答案 0 :(得分:69)
super()
。例如,以下代码不需要super:
class App extends React.component {
render(){
return <div>Hello { this.props.world }</div>;
}
}
但是,如果我们有一个构造函数,那么super()
是必需的:
class App extends React.component {
constructor(){
console.log(this) //Error: 'this' is not allowed before super()
}
}
在this
之前无法允许super()
的原因是this
如果未调用super()
则未初始化this
。但是,即使我们没有使用super()
,我们也需要在构造函数中使用ES6 class constructors MUST call super if they are subclasses
,因为super()
。因此,只要您有构造函数,就必须调用super(props)
。 (但是子类不必有构造函数)。
如果我们必须使用this.props
,我们会在构造函数中调用class App extends React.component{
constructor(props){
super(props);
console.log(this.props); // prints out whatever is inside props
}
}
,例如:
EditText
我希望我能说清楚。
答案 1 :(得分:65)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
将调用其super()
课程的constructor
。当您需要从父类访问某些变量时,这是必需的。
在React中,当您使用道具呼叫parent
时。 React将通过super
在整个组件中提供props
。见下面的例子2
没有this.props
super()
class A {
constructor() {
this.a = 'hello'
}
}
class B extends A {
constructor(){
console.log(this.a) //throws an error
}
}
console.log(new B())
super()
希望这有帮助!
答案 2 :(得分:1)
在 JavaScript 中,super 指的是父类构造函数。
重要的是,在调用父构造函数之前,您不能在构造函数中使用 this。 JavaScript 不会让你: 但是我们忘记了如果在 super() 调用有机会设置 this.name 之前调用了一个函数。所以 this.name 甚至还没有定义!如您所见,像这样的代码很难思考。 为了避免此类陷阱,JavaScript 强制要求如果您想在构造函数中使用 this,则必须首先调用 super。让父母做它的事!这个限制也适用于定义为类的 React 组件:
答案 3 :(得分:0)
在为React.Component subclass
实现构造函数时,应在其他任何语句之前调用super(props)
。否则,this.props
将在构造函数中为undefined
,这可能会导致错误。
答案 4 :(得分:0)
值得补充的是,super()
是超类构造函数的缩写,是inheritance的概念。
默认情况下,类Square
从其超类React.Component
继承构造函数。
可以通过声明新的constructor()
方法来覆盖继承的构造函数。
如果要扩展而不是覆盖超类构造函数,则必须使用super()
显式调用它。
答案 5 :(得分:0)
super();不是必需的,而是由ES6子类强制的
答案 6 :(得分:-2)
要使用this
关键字,我们应该使用前面的super
关键字。为什么? super
用于调用父类constructor
。
现在为什么我们需要打电话给父母constructor
?答案是初始化我们通过this
关键字引用的属性值。