在JavaScript中,子对象可以通过this
关键字或者super
关键字来引用其父对象(在ES6的类语法中)。以下是一些基础概念和相关信息:
null
)。new
关键字来创建对象,构造函数的prototype
属性会成为新创建对象的原型。在ES5中,可以通过构造函数的prototype
属性来设置子对象的原型,从而实现继承。
function Parent() {
this.name = 'Parent';
}
Parent.prototype.sayHello = function() {
console.log('Hello, I am ' + this.name);
};
function Child() {
Parent.call(this); // 调用父类构造函数
this.name = 'Child';
}
// 设置子类的原型为父类的实例,实现继承
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child; // 修复构造函数指向
var child = new Child();
child.sayHello(); // 输出: Hello, I am Child
在ES6中,可以使用class
和extends
关键字来实现继承,通过super
关键字来引用父类。
class Parent {
constructor() {
this.name = 'Parent';
}
sayHello() {
console.log('Hello, I am ' + this.name);
}
}
class Child extends Parent {
constructor() {
super(); // 调用父类构造函数
this.name = 'Child';
}
}
const child = new Child();
child.sayHello(); // 输出: Hello, I am Child
问题:子类覆盖了父类的方法,但有时仍需要调用父类的方法。
解决方法:在子类中,可以使用super
关键字来调用父类的方法。
class Child extends Parent {
sayHello() {
super.sayHello(); // 调用父类的sayHello方法
console.log('And I am a child.');
}
}
const child = new Child();
child.sayHello();
// 输出:
// Hello, I am Child
// And I am a child.
问题:子类构造函数中忘记调用super()
。
解决方法:确保在子类的构造函数中首先调用super()
,以便正确初始化父类部分。
class Child extends Parent {
constructor() {
super(); // 必须先调用super()
// 其他初始化代码
}
}
如果不调用super()
,子类的this
将不会被初始化,会导致引用错误。
领取专属 10元无门槛券
手把手带您无忧上云