js原型 原型链
时间: 2025-03-13 13:05:20 浏览: 1
JavaScript 原型与原型链详解
一、原型的概念
在 JavaScript 中,几乎所有的对象都拥有一个特殊的属性 [[Prototype]]
,这个属性通常通过 __proto__
属性访问。它指向另一个对象,即该对象的原型。当试图访问一个对象的某个属性时,如果此对象本身不存在该属性,则会沿着 [[Prototype]] 链向上查找,直到找到具有该属性的对象或者到达链顶端(null),这就是所谓的原型链机制[^1]。
二、创建对象的方式及其对应的原型关系
普通对象 当使用字面量方式
{}
创建对象时,默认情况下它的__proto__
指向 Object.prototype。构造函数实例化对象 使用 new 关键字调用构造器来创建新对象时,新对象内部的
[[Prototype]]
将被设置为构造器的 prototype 属性所指的对象。例如:```javascript
function Person(name){ this.name = name; } let personInstance = new Person('John'); console.log(personInstance.proto === Person.prototype); // true
3. **ES6 类定义**
ES6 引入了 class 语法糖,在底层仍然基于原型实现继承逻辑。类声明实际上也是函数表达式的另一种形式,因此其行为类似于传统构造函数模式下的原型链接[^2]。
#### 三、原型链的工作流程
每当尝试读取一个对象上的属性时,JavaScript 解释器不仅会在当前对象上寻找该属性,还会顺着这条由多个 `[[Prototype]]` 连接而成的链条逐层往上找,直至遇到第一个包含目标属性的对象为止;若遍历到最顶层仍未发现所需属性,则返回 undefined 或者抛出错误(取决于具体场景)[^3]。
```javascript
// 示例代码展示原型链工作过程
function Animal() {}
Animal.prototype.eat = function () { console.log("eating..."); };
function Dog() {}
Dog.prototype.bark = function (){ console.log("barking!"); };
Dog.prototype.__proto__ = Animal.prototype;
const myDog = new Dog();
myDog.bark(); // 输出:"barking!"
myDog.eat(); // 输出:“eating..."
上述例子中展示了简单的单级继承结构,其中 Dog 的原型是指向 Animal 的原型对象,而后者又最终连接到了 Object.prototype 上形成完整的原型链路。
四、关于静态方法和实例方法
对于构造函数而言,可以区分两种不同性质的方法:一种是在构造函数自身的 Function 对象上调用的方法称为静态方法;另一种则是挂载在其 Prototype 成员之内的成员被称为实例方法。前者不会随着每次新建实例重复存在,而是共享给所有同类实例共同使用的工具集;后者则属于每一个具体的实体个体私有特性的一部分。
阅读全文
相关推荐

















