返回
深入探秘 JavaScript 原型链
前端
2023-11-12 07:23:17
万物皆对象:普通对象与函数对象
JavaScript 中,万物皆对象!但对象之间却存在着差异,可分为普通对象和函数对象。Object 和 Function 是 JavaScript 自带的函数对象。
const obj = {}; // 普通对象
const func = function() {}; // 函数对象
原型链:对象之间的连接桥梁
在 JavaScript 中,每个对象都隐式拥有一个名为 proto 的内部属性,该属性指向其原型对象。原型对象也是一个对象,它拥有自己的 proto 属性,以此类推,形成一条对象的链接链,称为原型链。
obj.__proto__ === Function.prototype; // true
func.__proto__ === Function.prototype; // true
构造函数:对象的蓝图
构造函数是用于创建新对象的特殊函数,它通过 new 运算符调用。每个构造函数都有一个 prototype 属性,该属性指向一个对象,该对象作为所有由该构造函数创建的对象的原型。
function Person(name) {
this.name = name;
}
const person = new Person('John');
person.__proto__ === Person.prototype; // true
继承:从原型链中汲取力量
原型链使得 JavaScript 实现继承成为可能。当一个对象从另一个对象继承时,它继承了后者的原型对象中定义的所有属性和方法。
function Employee(name, salary) {
Person.call(this, name);
this.salary = salary;
}
Employee.prototype = Object.create(Person.prototype);
const employee = new Employee('Jane', 1000);
employee.__proto__ === Employee.prototype; // true
employee.__proto__.__proto__ === Person.prototype; // true
拓展原型:动态添加属性和方法
可以动态地向原型对象中添加属性和方法,从而扩展所有与其关联的对象的功能。
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name}`);
};
person.greet(); // 输出: Hello, my name is John
理解原型链的重要性
掌握原型链对于理解 JavaScript 至关重要。它解释了以下关键概念:
- 对象之间的关系和继承
- 属性和方法的查找机制
- 如何扩展和修改对象行为
通过深入了解原型链,开发者可以更有效地编写和调试 JavaScript 代码。