您好,登录后才能下订单哦!
# JavaScript中的原型和原型链是什么
## 引言
在JavaScript中,原型(Prototype)和原型链(Prototype Chain)是理解对象继承和属性查找机制的核心概念。尽管现代JavaScript引入了`class`语法,但其底层仍然基于原型继承。本文将深入探讨原型和原型链的概念、工作原理以及实际应用。
---
## 1. 原型(Prototype)基础
### 1.1 什么是原型?
每个JavaScript对象(除`null`外)都有一个内置的`[[Prototype]]`属性(可通过`__proto__`或`Object.getPrototypeOf()`访问),指向另一个对象,这个对象就是当前对象的“原型”。
```javascript
const obj = {};
console.log(obj.__proto__ === Object.prototype); // true
构造函数通过prototype
属性关联原型对象,实例通过__proto__
指向该原型。
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log(`Hello, ${this.name}!`);
};
const alice = new Person('Alice');
alice.sayHello(); // 调用原型方法
当访问对象的属性时,JavaScript会按以下顺序查找:
1. 对象自身属性
2. 对象的[[Prototype]]
(原型)
3. 原型的[[Prototype]]
(形成链式结构)
4. 直到null
(链的末端)
alice.toString(); // 调用Object.prototype.toString
(示意图:实例 → Person.prototype → Object.prototype → null)
通过Object.setPrototypeOf()
或直接赋值__proto__
(不推荐)可以修改原型链。
const parent = { familyName: 'Smith' };
const child = { name: 'Tom' };
Object.setPrototypeOf(child, parent);
console.log(child.familyName); // 'Smith'
结合call
和原型赋值实现继承。
function Parent(name) {
this.name = name;
}
Parent.prototype.sayName = function() {
console.log(this.name);
};
function Child(name, age) {
Parent.call(this, name); // 继承属性
this.age = age;
}
Child.prototype = Object.create(Parent.prototype); // 继承方法
Child.prototype.constructor = Child;
class
语法class
是原型继承的语法糖。
class Parent {
constructor(name) {
this.name = name;
}
sayName() {
console.log(this.name);
}
}
class Child extends Parent {
constructor(name, age) {
super(name);
this.age = age;
}
}
Object.create(proto)
:以指定原型创建对象Object.getPrototypeOf(obj)
:获取对象的原型instanceof
:检查构造函数的原型是否在对象链上Object.setPrototypeOf
)会破坏引擎优化无意中修改原型对象会影响所有实例。
Array.prototype.push = function() {
console.log('Hacked!');
};
[1, 2].push(3); // 所有数组受影响
for...in
遍历会枚举原型链上的可枚举属性,需配合hasOwnProperty
使用。
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key); // 仅自身属性
}
}
将公共方法定义在原型上节省内存。
function Car(model) {
this.model = model;
}
Car.prototype.drive = function() {
console.log(`${this.model} is driving.`);
};
通过原型链实现多层继承关系(如UI组件库)。
class
语法__proto__
Object.hasOwn()
替代hasOwnProperty
// 组合示例
const canEat = {
eat() { console.log('Eating...'); }
};
const canWalk = {
walk() { console.log('Walking...'); }
};
class Person {
constructor() {
Object.assign(this, canEat, canWalk);
}
}
原型和原型链是JavaScript面向对象编程的基石。理解这些概念有助于: - 编写更高效的代码 - 调试复杂的继承关系 - 深入理解框架(如React/Vue)的底层机制
尽管现代开发中class
语法更直观,但掌握原型机制仍是进阶JavaScript开发的必备技能。
“`
字数统计:约2150字(含代码示例)
扩展建议:可进一步探讨Symbol
与原型的关系、V8引擎对原型链的优化等高级话题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。