返回
对象系列探究:原型和原型链,揭秘 JavaScript 的继承机制
前端
2023-12-05 11:09:28
作为「深入对象系列」的第二篇章,本文将继续深入探究 JavaScript 对象的奥秘,聚焦于 原型 与 原型链 。通过详尽的代码示例,我们将揭开 JavaScript 中的继承机制,为理解 JavaScript 的面向对象特性打下坚实的基础。
一、原型与原型链:面向对象的基础
在 JavaScript 中,对象是第一等公民,原型则是对象的基础。每个对象都拥有一个隐式的 原型对象 ,该原型对象又指向另一个原型对象,如此递归形成 原型链 。
二、函数对象:JavaScript 中的隐式类
JavaScript 中的函数实际上也是对象,称为 函数对象 。函数对象具有一个特殊的属性——prototype ,该属性指向一个 prototype 对象 ,它就是函数创建的所有实例的原型。
function Person(name) {
this.name = name;
}
// 函数对象的 prototype 属性指向一个原型对象
console.log(Person.prototype); // Person {}
三、构造函数:实例化对象的模版
构造函数 是一种特殊的函数,用于创建对象实例。当调用构造函数时,会创建一个新对象,该对象继承构造函数的原型。
// 定义构造函数
function Person(name) {
this.name = name;
}
// 使用构造函数创建对象实例
const person = new Person('John');
console.log(person.name); // John
四、原型链:继承的桥梁
通过原型链,对象可以继承其原型对象的属性和方法。当访问一个对象不存在的属性时,JavaScript 会沿着原型链向上查找,直到找到该属性或到达原型链的末尾(Object.prototype)。
// Person 的原型对象定义了 greet 方法
Person.prototype.greet = function() {
console.log(`Hello, ${this.name}!`);
};
// person 实例可以通过原型链继承 greet 方法
person.greet(); // Hello, John!
五、打破原型链:Object.create
在某些情况下,可能需要打破原型链。JavaScript 提供了 Object.create 方法,可以创建一个新对象,该对象指定的对象作为其原型。
// 使用 Object.create 创建一个没有原型链的对象
const orphan = Object.create(null);
console.log(orphan.prototype); // undefined
六、结语
理解原型和原型链是深入理解 JavaScript 对象模型的关键。通过掌握这些概念,开发者可以灵活运用 JavaScript 的面向对象特性,创建可重用、可扩展的代码。