JavaScript通过原型链实现继承,对象的[[Prototype]]指向原型,共享属性方法。函数的prototype用于构造实例,子类可通过Object.create()继承父类原型,结合构造函数借用实现组合继承。ES6引入class和extends语法,使继承更直观,但底层仍基于原型链。掌握原型链是理解JS面向对象的核心。

JavaScript 中的原型链继承是实现面向对象编程的核心机制之一。它不同于传统基于类的语言(如 Java 或 C++),而是通过对象之间的链接关系来实现方法和属性的共享与继承。理解原型链,是掌握 JS 面向对象的关键一步。
在 JavaScript 中,每个对象都有一个内部属性 [[Prototype]],指向其原型对象。这个原型对象可以包含可被继承的方法和属性。现代浏览器中通常可通过 __proto__ 访问,但更推荐使用 Object.getPrototypeOf() 方法。
函数除了有 [[Prototype]] 外,还拥有一个 prototype 属性,该属性仅在函数作为构造函数时使用。当用 new 调用构造函数创建实例时,实例的 [[Prototype]] 会指向构造函数的 prototype 对象。
示例:
function Person(name) {
this.name = name;
}
Person.prototype.greet = function() {
console.log("Hello, I'm " + this.name);
};
const john = new Person("John");
john.greet(); // 输出: Hello, I'm John
这里 john 的 __proto__ 指向 Person.prototype,从而可以访问 greet 方法。
最基础的继承方式是将子类的 prototype 设置为父类的一个实例,使子类实例能沿着原型链访问父类的属性和方法。
经典写法:
function Animal(voice) {
this.voice = voice;
}
Animal.prototype.speak = function() {
console.log(this.voice);
};
function Dog(name) {
Animal.call(this, "Woof!"); // 借用构造函数,继承实例属性
this.name = name;
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // 修正构造器指向
const dog = new Dog("Buddy");
dog.speak(); // 输出: Woof!
关键点:
上面的方式虽然可行,但会调用两次父类构造函数。更优方案是使用寄生组合式继承,避免重复调用。
实际开发中,可以通过封装一个 inherit 函数来简化过程:
function inherit(subType, superType) {
const prototype = Object.create(superType.prototype);
prototype.constructor = subType;
subType.prototype = prototype;
}
使用方式不变,但更加高效和清晰。
ES6 引入了 class 和 extends 关键字,让继承写法更接近传统语言,底层仍基于原型链。
class Animal {
constructor(voice) {
this.voice = voice;
}
speak() {
console.log(this.voice);
}
}
class Dog extends Animal {
constructor(name) {
super("Woof!");
this.name = name;
}
}
const dog = new Dog("Buddy");
dog.speak(); // 输出: Woof!
这种写法语义清晰,推荐在现代项目中使用。
基本上就这些。掌握原型链继承的本质,无论使用原生方式还是 class 语法,都能写出结构良好的面向对象代码。
以上就是JS原型链继承_面向对象编程实战指南的详细内容,更多请关注php中文网其它相关文章!
编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号