JavaScript 是一门面向对象的编程语言,因此在 JavaScript 中实现继承的方式和其他面向对象编程语言如 Java 和 Python 有些区别。下面是一个完整的 JavaScript 面向对象继承攻略,示例说明了两种常用的继承方式。
1. 构造函数继承
构造函数继承是通过在子类构造函数中调用父类构造函数来继承父类属性和方法,这种继承方式存在一个明显的缺点,就是导致父类中的方法无法共享使用。
下面是一个示例代码:
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHello = function() {
console.log("Hello, I'm " + this.name);
}
// Student 是 Person 的子类
function Student(name, age, grade) {
Person.call(this, name, age);
this.grade = grade;
}
这里定义了一个 Person
构造函数,它有两个属性 name
和 age
,还有一个 sayHello
方法。然后定义了一个子类 Student
,在构造函数中使用 call
方法调用了 Person
父类的构造函数并传入相应参数,实现了继承。
2. 原型链继承
原型链继承是通过将子类的原型对象设置为父类的实例来实现继承,这种方式可以实现方法共享,但是存在一个问题,就是父类的属性是存在于父类实例中而非父类原型中的,因此无法实现属性的继承。
下面是一个示例代码:
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHello = function() {
console.log("Hello, I'm " + this.name);
}
// Student 是 Person 的子类
function Student(grade) {
this.grade = grade;
}
Student.prototype = new Person();
const student = new Student(3);
console.log(student.name); // undefined
console.log(student.age); // undefined
console.log(student.grade); // 3
student.sayHello(); // Hello, I'm undefined
这里定义了一个 Person
构造函数和一个 Student
子类构造函数。定义 Student
的原型对象为 Person
类的实例,实现了继承。但是由于父类 Person
的属性是存在于父类实例中而非父类原型中的,因此无法实现属性的继承。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript 面向对象 继承 - Python技术站