原型继承和类继承是JavaScript中实现对象间共享属性和方法的两种主要方式。
- 原型继承:原型继承是通过对象的原型(prototype)来实现的。每个对象都有一个原型,当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,那么会沿着原型链向上查找,直到找到这个属性或方法为止。原型继承的主要优点是可以实现属性和方法的共享,节省内存空间。但是,原型继承的缺点是不支持私有属性和方法,因为所有子对象都可以访问到原型上的属性和方法。
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log('Hello, my name is ' + this.name);
};
var person1 = new Person('Tom');
var person2 = new Person('Jerry');
person1.sayHello(); // Hello, my name is Tom
person2.sayHello(); // Hello, my name is Jerry
- 类继承:类继承是通过class关键字和extends关键字来实现的。在ES6中引入了类的概念,实际上类是构造函数的语法糖。通过类继承,子类可以继承父类的属性和方法,同时也可以覆盖或扩展父类的方法。类继承的优点是支持私有属性和方法,并且代码更加清晰易读。但是,类继承的缺点是每个实例对象都有自己的属性和方法副本,可能会占用更多的内存空间。
class Person {
constructor(name) {
this.name = name;
}
sayHello() {
console.log('Hello, my name is ' + this.name);
}
}
class Student extends Person {
constructor(name, age) {
super(name);
this.age = age;
}
sayHello() {
super.sayHello();
console.log('I am ' + this.age + ' years old');
}
}
const student = new Student('Tom', 18);
student.sayHello(); // Hello, my name is Tom. I am 18 years old.
总结:原型继承和类继承在实现方式和优缺点上有所不同,根据实际需求和场景选择合适的继承方式。