JavaScript原型链 - 获取父级的父级

5

我一直在阅读关于JavaScript原型链的相关资料,据我所知,有一个全局 Object.prototype 作为其他原型的基础,例如 Array.prototype,可以成为另一个原型的基础。就像基于类的面向对象编程中的继承一样。这很好。

现在,我想检查并比较不同对象的原型。如果 Array 的原型是基于 Object.prototype,那么我猜应该可以使用类似于 Array.prototype.prototype 的东西。但它是未定义的:

> Array.prototype.prototype
undefined

当我输入__proto__而不是prototype时,我得到:

> Array.__proto__
[Function: Empty]
> Object.__proto__
[Function: Empty]
> Array.__proto__.__proto__
{}

(控制台输出是来自nodejs的). 我有以下问题:

  • 如何访问原型的“父原型”?
  • prototype__proto__的区别是什么?
1个回答

5

我相信你正在寻找:

Object.getPrototypeOf(Array.prototype);
// The same as Object.prototype

(这是一个 ES5 特性,不兼容某些较旧的浏览器)。

prototype 和 __proto__ 有什么区别?

prototype 属性始终属于构造函数(例如 ObjectArray 和自定义构造函数)。__proto__ 属性存在于使用这些构造函数创建的实例上,并指向与构造函数的 prototype 属性相同的对象。

例如:

function MyClass(){}
var myObj = new MyClass();
myObj.__proto__ === MyClass.prototype; // true

在您提供的例子中,Array.__proto__ 实际上是构造函数的原型对象 - 而不是它的 prototype 属性。这就是为什么它是 [Function: Empty],因为 Array 是一个函数,是默认的 Function 构造函数的实例。某个特定数组实例的 __proto__Array.prototype 相同:
var arr = [];
arr.__proto__ === Array.prototype; // true

不完全正确。Array.prototype 本身是“与某个数组实例的 __proto__ 相同”,而不是它的原型。 - Bergi
@Bergi 如果这是关于我第一个代码块上的评论,你是对的。已删除。 - bfavaretto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接