JavaScript原型与原型链机制及实例关系解析

作者:闭包旅人

时间:2026-10-25

浏览:233

本文深入解析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 Person

3. 在原型的原型上寻找:

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原型与原型链内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章