JavaScript通过原型和原型链实现继承,每个函数的prototype指向原型对象,实例通过__proto__链接到构造函数的prototype,形成查找链:实例→构造函数.prototype→Object.prototype→null。示例中Person.prototype添加sayHello方法,p1实例可访问,体现属性共享。原型链查找机制先在对象自身找属性,未果则沿__proto__向上追溯,如p1.__proto__ === Person.prototype为true,Person.prototype.__proto__ === Object.prototype亦然,最终Object.prototype.__proto__为null。继承通过将子类原型设为父类实例实现,如Dog继承Animal:用Animal.call(this, name)调用父类构造函数,Object.create(Animal.prototype)建立原型链,并修正constructor指向。ES6的class与extends是语法糖,底层仍基于原型链,class Animal定义构造函数与方法,class Dog extends Animal使用super调用父类,使继承更直观。掌握原型机制是理解JavaScript对象关系与方法调用逻辑的关键。

JavaScript的继承机制不同于传统的面向对象语言,它基于原型(Prototype)和原型链(Prototype Chain)实现。理解这一机制是掌握JavaScript核心的关键。
在JavaScript中,每个函数都有一个prototype属性,这个属性指向一个对象,即该函数的原型对象。原型对象包含可以被所有实例共享的属性和方法。
当通过构造函数创建一个新对象时,这个对象内部会链接到构造函数的prototype,从而可以访问其中定义的属性和方法。
示例:
立即学习“Java免费学习笔记(深入)”;
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log("Hello, I'm " + this.name);
};
const p1 = new Person("Alice");
p1.sayHello(); // 输出: Hello, I'm Alice
这里p1虽然没有直接定义sayHello方法,但它能调用,是因为它通过原型链找到了Person.prototype上的方法。
当访问一个对象的属性或方法时,JavaScript引擎首先在该对象自身上查找。如果找不到,就会沿着__proto__(现代标准中为[[Prototype]])指向的原型对象继续查找,这个过程一直持续到找到属性或到达原型链顶端(即null)为止。
原型链的结构通常如下:
例如:
console.log(p1.__proto__ === Person.prototype); // true console.log(Person.prototype.__proto__ === Object.prototype); // true console.log(Object.prototype.__proto__); // null
这表明p1的原型是Person.prototype,而后者又继承自Object.prototype,最终链向null。
JavaScript中的继承通常是通过原型链来实现的。常见的做法是将子类的原型设置为父类的一个实例。
基本模式:
function Animal(name) {
this.name = name;
}
Animal.prototype.eat = function() {
console.log(this.name + " is eating.");
};
function Dog(name, breed) {
Animal.call(this, name); // 继承属性
this.breed = breed;
}
// 建立原型链
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.bark = function() {
console.log("Woof!");
};
const dog = new Dog("Buddy", "Golden Retriever");
dog.eat(); // Buddy is eating.
dog.bark(); // Woof!
关键点:
ES6引入了class语法糖,使原型继承更直观,但底层仍是基于原型链。
class Animal {
constructor(name) {
this.name = name;
}
eat() {
console.log(`${this.name} is eating.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
bark() {
console.log("Woof!");
}
}
上述代码在行为上与前面的原型继承完全一致,只是语法更清晰。编译后依然是通过修改原型链实现。
基本上就这些。原型与原型链是JavaScript动态性和灵活性的基础,掌握它才能真正理解对象之间的关系和方法调用背后的逻辑。不复杂但容易忽略。
以上就是JavaScript原型与原型链继承机制剖析_javascript核心的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号