JavaScript,如何理解对象的原型链?循环获取原型
发布于 作者:苏南大叔 来源:程序如此灵动~

本文讨论对JavaScript
原型链的更深层次的理解。将从上一篇文章的instanceof
作为引子,展开有关原型链的讨论。看看instanceof
的判断依据是什么。

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。本文测试环境:nodejs@20.18.0
,chrome@132.0.6834.84
。原型链不仅链接了属性及方法,还链接了父子继承关系。
前文回顾
本文的代码基于下面这篇文章:
代码简化:
这个代码里面,基于Person
派生出来了两个子类,分别是Man
和Woman
,对应的实例分别是sunan
和xmm
。然而,两者的不同点在于:Man
对其prototype.constructor()
进行了修正。从而导致了instanceof
的判断结果,出现了差异性。
对象sunan
被判定为属于Man
和Person
的实例。而xmm
被判定为Woman
的实例,但是并非Person
的实例。这仅仅是因为Man
对构造方法进行了修正。
instanceof
instanceof
运算符用于检测一个对象是否在其原型链中存在某一个类(名)。

获取原型
可以通过下面的方法,获得一个obj
的原型(没有链)。
或者:
测试代码:

上面的代码测试结果表明:
- 类实例没有
.prototype
,但是有.__proto__
内置属性,它指向该对象的原型。 - 每个类都有一个名为
prototype
的属性,它是一个对象,包含构造函数的原型对象具有的属性和方法。 __proto__
属性是指向该对象的原型,等同于Object.getPrototypeOf()
prototype
属性是用于创建该对象的构造函数的原型。
递归获得原型【链】
在JavaScript
中,递归地获取一个对象的原型链,通常指的是通过原型链向上追溯到Object.prototype
。这个过程可以通过递归地调用Object.getPrototypeOf()
方法来实现。这个方法返回指定对象的原型,如果没有继承任何东西,则会返回null
。
代码调用:
输出:

递归获得原型【链】2
输出:
从这个原型链的数组可以看出:instanceof
的判断标准,就是来自于__proto__
/Object.getPrototypeOf()
的层层调用结果的比对。
参考文章
结语
更多苏南大叔的JavaScript
经验文章,可以参考:


