JavaScript 实现对象的继承有哪几种方式?
参考答案:
在 JavaScript 中,实现对象的继承主要有以下几种方式:
- 原型链继承:这是 JavaScript 中最早的继承方式,主要利用了原型链的特性。当一个对象试图访问一个属性时,如果它自身没有这个属性,那么 JavaScript 就会在其原型(也就是它的
__proto__
属性)上查找这个属性,这个过程会沿着原型链一直向上查找,直到找到这个属性或者达到原型链的顶端(null
)。因此,我们可以让一个对象的原型指向另一个对象,来实现继承。
function Parent() {
this.name = 'parent';
}
function Child() {}
Child.prototype = new Parent();
let child = new Child();
console.log(child.name); // 'parent'
这种方式的缺点是:如果父对象的属性引用的是对象,那么子对象会共享这个对象,修改子对象的这个属性会影响到父对象。 2. 借用构造函数继承:为了避免原型链继承的缺点,我们可以使用借用构造函数的方法。这种方法的思想是,在子对象的构造函数中调用父对象的构造函数,从而复制父对象的属性到子对象。
function Parent() {
this.name = 'parent';
}
function Child() {
Parent.call(this);
}
let child = new Child();
console.log(child.name); // 'parent'
这种方式的缺点是:子对象无法继承父对象的方法。 3. 组合继承:组合继承是原型链继承和借用构造函数继承的结合,可以发挥两者的优点,避免它们的缺点。具体做法是在子对象的构造函数中调用父对象的构造函数,让子对象继承父对象的属性,同时让子对象的原型指向父对象的一个实例,这样子对象就可以继承父对象的方法。
function Parent() {
this.name = 'parent';
}
function Child() {
Parent.call(this);
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
let child = new Child();
console.log(child.name); // 'parent'
这种方式的缺点是:调用了两次父对象的构造函数,生成了两份相同的属性。
4. ES6 类的继承:ES6 引入了类的概念,可以使用 extends
关键字实现类的继承,这种方式是语法糖,本质上还是原型链继承。
class Parent {
constructor() {
this.name = 'parent';
}
}
class Child extends Parent {}
let child = new Child();
console.log(child.name); // 'parent'
这种方式的优点是语法更简洁,易于理解,而且避免了原型链继承的缺点。
以上就是 JavaScript 中实现对象继承的几种主要方式。