JavaScript继承基于原型链,对象通过[[Prototype]]链接到原型,查找属性时逐层向上追溯直至Object.prototype或null。构造函数的prototype属性为实例提供共享方法和属性,实例的__proto__指向构造函数的prototype。原型链形成于对象原型的嵌套链接,实现继承的核心是让子类原型指向父类实例或原型。常见继承方式包括:原型链继承(共享属性问题)、组合继承(借用构造函数+原型链,推荐)以及ES6 class语法(语法糖,底层仍为原型)。class通过extends实现继承,super调用父类构造器,提升代码可读性。关键点:所有对象均有原型,属性查找依循原型链;构造函数、prototype与实例三者关联;继承本质是扩展原型链;ES6 class为首选语法,但原型机制始终是基础。理解原型与原型链是掌握JavaScript面向对象编程的核心。

JavaScript的继承机制基于原型(Prototype),不同于传统面向对象语言中的类继承。每个对象都有一个内部链接指向另一个对象,这个被指向的对象就是它的“原型”。当访问一个对象的属性时,如果该对象本身没有这个属性,JavaScript引擎会自动去它的原型上查找,这一过程会持续向上直到找到属性或到达原型链的末端(null)。
原型与构造函数的关系
在JavaScript中,使用构造函数创建对象时,构造函数会自动生成一个prototype属性,这个属性是一个对象,包含可以被所有实例共享的属性和方法。
每个通过构造函数创建的实例,其内部都持有一个指向构造函数prototype的链接(通常表示为[[Prototype]],可通过__proto__访问)。
构造函数的prototype是实例的原型 实例的__proto__等于构造函数的prototype 原型对象默认有一个constructor属性,指向构造函数本身
示例:
立即学习“Java免费学习笔记(深入)”;
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 → true
原型链的形成
当一个对象的原型本身也有原型时,就形成了原型链。查找属性时,JavaScript会沿着这条链逐层查找。
对象自身 → 原型对象 → 原型的原型 → … → Object.prototype → null Object.prototype是绝大多数对象的最终原型,它的[[Prototype]]是null 所有函数的原型最终继承自Function.prototype,而Function.prototype的原型是Object.prototype
例如:
const obj = {};// obj.toString() 实际来自 Object.prototypeobj.hasOwnProperty('name'); // 来自 Object.prototype
实现继承的方法
JavaScript中可以通过多种方式实现对象间的继承,核心是让子类型的原型指向父类型的实例或原型。
1. 原型链继承
function Animal() { this.type = "animal"; }Animal.prototype.eat = function() { console.log("Eating"); };function Dog() { this.species = "dog"; }Dog.prototype = new Animal(); // 继承Animalconst myDog = new Dog();myDog.eat(); // Eating
缺点:所有实例共享父类实例属性,无法向父类构造函数传参。
2. 构造函数借用(经典组合继承)
function Animal(name) { this.name = name;}function Dog(name) { Animal.call(this, name); // 继承属性}Dog.prototype = Object.create(Animal.prototype);Dog.prototype.constructor = Dog; // 修正构造器引用
这种方式既继承了属性,又继承了方法,是较为推荐的做法。
3. ES6 class语法(语法糖)
class Animal { constructor(name) { this.name = name; } speak() { console.log(this.name + " makes a sound"); }}class Dog extends Animal { constructor(name, breed) { super(name); this.breed = breed; } bark() { console.log("Woof!"); }}
class本质上仍是基于原型的,只是提供了更清晰的语法。
关键点总结
每个JavaScript对象都有原型,查找属性时遵循原型链 构造函数、prototype、实例三者通过prototype和__proto__关联 继承的本质是扩展原型链,使子对象能访问父对象的属性和方法 现代开发中推荐使用ES6 class,底层仍是原型机制
理解原型和原型链是掌握JavaScript对象系统的核心。虽然语法不断演进,但原型机制始终是其继承模型的基础。
以上就是JavaScript原型继承_javascript对象系统的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1539971.html
微信扫一扫
支付宝扫一扫