我一直在阅读javascript原型链接,据我所知,有一个全局Object.prototype
是其他原型的基础,例如Array.prototype
,它可以作为另一个原型的基础原型。就像基于类的OOP中的继承一样。没关系。
现在,我想检查并比较不同对象的原型。如果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__
之间有什么区别?答案 0 :(得分:4)
我相信你在寻找:
Object.getPrototypeOf(Array.prototype);
// The same as Object.prototype
(这是ES5功能,not compatible with some older browsers)。
原型和__proto __
之间的区别是什么
prototype
属性始终属于构造函数(如Object
,Array
和自定义构造函数)。 __proto__
属性存在于使用此类构造函数创建的实例上,并指向与constructor.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