在JavaScript中,原型链是实现继承的核心机制。
原型链基础:
- 每个JS对象都有一个隐藏的__proto__属性,指向它的原型对象
- 当访问对象的属性时,如果对象本身没有该属性,就会沿着原型链向上查找
- 原型对象也有自己的原型,最终指向null,形成一条链式结构
构造函数与原型:
- 构造函数通过prototype属性关联原型对象
- 使用new创建实例时,实例的__proto__会自动指向构造函数的prototype
- 例如:function Person(){},Person.prototype就是所有Person实例的原型
继承实现方式:
- 原型链继承:通过将子类的原型指向父类的实例实现继承
- 构造函数继承:在子类构造函数中调用父类构造函数
- 组合继承(最常用):结合原型链继承和构造函数继承的优点
ES6类继承:
使用class和extends语法糖,底层仍然是基于原型链
示例代码:
// 父类
function Animal(name) {
this.name = name
}
Animal.prototype.speak = function() {
console.log(this.name + ' makes a noise.')
}
// 子类
function Dog(name) {
Animal.call(this, name) // 构造函数继承
}
Dog.prototype = Object.create(Animal.prototype) // 原型链继承
Dog.prototype.constructor = Dog // 修复构造函数指向
const d = new Dog('Buddy')
d.speak() // 输出: Buddy makes a noise.
这段代码展示了组合继承的实现方式,通过原型链实现了方法的共享和属性的独立。