js constructor super
时间: 2023-09-21 18:06:41 浏览: 152
回答: 在Javascript中,constructor和super是用于继承中的关键字。constructor是用于定义类的构造函数,用于创建对象实例时进行初始化操作。而super用于调用父类的构造函数。当在子类中使用super()时,它会绑定子类的this,并调用父类的构造函数。同时,super也可以用来访问父类的属性和方法。在构造函数中,使用super调用父类的构造函数是必须的,因为子类继承了父类的属性和方法,但是子类没有自己的this对象,需要通过调用父类的构造函数来初始化自己的属性。另外,如果在子类中通过super对某个属性赋值,那么super在这里相当于this,赋值的属性会变成子类实例的属性。
相关问题
js constructor super 像父类传值
在JavaScript中,`super`关键字是在构造函数中的一个特殊引用,它允许你在子类的构造函数中调用父类的构造函数。`super()`主要用于访问和初始化父类的属性或方法,尤其是在使用ES6的类继承时。
当你在子类构造函数中使用`super()`,你可以传递参数给父类的构造函数,这个过程被称为“构造函数的超构造器调用”(也叫作构造函数链)。例如:
```javascript
class Parent {
constructor(name) {
this.name = name;
}
}
class Child extends Parent {
constructor(age, name) { // 子类构造函数
super(name); // 调用父类的构造函数并传递 'name' 参数
this.age = age; // 然后可以设置子类特有的属性
}
}
let child = new Child(5, "Alice");
console.log(child.name); // 输出 "Alice",因为这是从父类继承的
```
在这个例子中,当我们创建`Child`实例时,会先通过`super(name)`将`name`值传递给`Parent`的构造函数,然后`child`实例就可以有自己的`age`属性了。
class Start{ constructor(name,age,year){ this.name=name; this.age=age; this.year=year; } fn(value){ console.log(value) } } class Son extends Start{ constructor(val,val2){ this.sum = val+val2 } } // const son =new Son(10,10) // console.log(son) // son.fn(son.sum) //Uncaught ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor class Son_true extends Start { constructor(val,val2){ super(1,2,3); //利用super调用父类的构造函数super必须在子类this之前调用 this.sum = val+val2 } } const SonTrue =new Son_true(10,10) SonTrue.fn(SonTrue.sum) SonTrue.fn(SonTrue) //super(1,2,3) {name: 1, age: 2, year: 3, sum: 20}
你的代码中定义了一个父类 Start 和一个继承自 Start 的子类 Son。在子类 Son 的构造函数中,你试图使用 this 关键字来访问和初始化子类的属性 sum。
然而,在 JavaScript 中,如果一个子类有构造函数,它必须在使用 this 关键字之前调用父类的构造函数,即使用 super()。这是因为子类继承了父类的属性和方法,需要先初始化父类的部分,才能确保正确访问和使用继承的属性。
在你的代码中,你尝试在子类 Son 的构造函数中访问 this.sum,但没有先调用 super()。因此,你遇到了错误提示:"Uncaught ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor"。
为了解决这个问题,你需要在子类 Son 的构造函数中调用 super(),以便先初始化父类的属性。修改后的代码如下:
```javascript
class Son extends Start {
constructor(val, val2) {
super(); // 调用父类的构造函数
this.sum = val + val2;
}
}
```
另外,在你的代码中,你定义了另一个子类 Son_true,它正确地调用了父类的构造函数 super(1, 2, 3),并成功地访问和使用了继承的属性。所以当你创建 Son_true 的实例并调用 fn 方法时,会得到预期的结果。
希望这能帮助到你!如果你有任何其他问题,请随时问我。
阅读全文