JavaScript原型与原型链机制及实例关系解析
本文深入解析JavaScript中构造函数、实例与原型之间的关系。通过实例说明instanceof检测、属性继承及__proto__访问路径,阐述原型链的查找逻辑:从实例自有属性开始,沿__proto__向上搜索至Object.prototype,最终返回null。
原型
如图所示:

1. 使用 instanceof 运算符检测构造函数与实例之间的关系:
function Person () {.........}
person = new Person ()
res = person instanceof Person
res // true
2. 实例继承原型上定义的属性:
function Person () {........}
Person.prototype.type = 'object n'
person = new Person ()
res = person.type
res // object n
3. 实例访问原型:
实例通过 __proto__ 属性访问到原型,即 person.__proto__ === Person.prototype
4. 原型访问构造函数:
原型通过 constructor 属性访问构造函数,即 Person.prototype.constructor === Person
5. 实例访问构造函数:
person.__proto__.constructor === Person
原型链
在读取一个实例的属性的过程中,如果该属性在实例本身中未找到,就会沿着 __proto__ 指向的原型继续寻找;若仍未找到,则继续寻找原型的原型:
1. 首先在实例自身上寻找:
function Person() {}
Person.prototype.type = "object name Person";
person = new Person();
person.type = "我是实例的自有属性";
res = Reflect.ownKeys(person); //尝试获取到自有属性
console.log(res);
res = person.type;
console.log(res); //我是实例的自有属性(通过原型链向上搜索优先搜索实例里的)2. 在原型上寻找:
function Person() {}
Person.prototype.type = "object name Person";
person = new Person();
res = Reflect.ownKeys(person); //尝试获取到自有属性
console.log(res);
res = person.type;
console.log(res); //object name Person3. 在原型的原型上寻找:
function Person() {}
Person.prototype.type = "object name Person";
function Child() {}
Child.prototype = new Person();
p = new Child();
res = [p instanceof Object, p instanceof Person, p instanceof Child];
console.log(res); //[true, true, true] p同时属于Object,Person, Child
res = p.type; //层层搜索
console.log(res); //object name Person (原型链上搜索)
console.dir(Person);
console.dir(Child);4. 沿原型链向上搜索:
- 原型同样也可以通过 __proto__ 访问到原型的原型。例如,这里有一个构造函数 Child “继承” 了前者的构造函数 Person,然后通过 new Child 得到实例 p;
- 当访问 p 中的一个非自有属性的时候,就会通过 __proto__ 作为桥梁,连接起一系列原型、原型的原型、原型的原型的原型,直到 Object 构造函数为止;
- 原型链搜索会一直持续到 null 为止,如果搜不到该属性,则访问停止:
function Person() {}
Person.prototype.type = "object name Person";
function Child() {}
Child.prototype = new Person();
p = new Child();
res = p.__proto__;
console.log(res); //Person {}
res = p.__proto__.__proto__;
console.log(res); //Person {type:'object name Person'}
res = p.__proto__.__proto__.__proto__;
console.log(res); //{.....}
res = p.__proto__.__proto__.__proto__.__proto__;
console.log(res); //null到此这篇关于JavaScript原型和原型链与构造函数和实例之间的关系详解的文章就介绍到这了,更多相关JavaScript原型与原型链内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
什么时候该用JS构造器:与工厂模式、字面量的选择对比
2026-11-05 16:18:22
推荐几款轻量级JS照片墙开源库及对比
2026-11-05 15:56:19
JavaScript递归写法有哪些常见陷阱及避免方法
2026-11-05 14:53:38
JS数组浅拷贝与深拷贝怎么选?场景与方法总结
2026-11-05 14:41:02
p5.js 中 setup() 和 draw() 函数的执行机制详解
2026-11-05 12:32:38
