__proto__与 constructor.prototype 有何不同?

function Gadget(name, color)
{
   this.name = name;
   this.color = color;
}

Gadget.prototype.rating = 3

var newtoy = new Gadget("webcam", "black")

newtoy.constructor.prototype.constructor.prototype.constructor.prototype 

它始终返回分级 = 3 的对象。

但是,如果我执行以下操作:

newtoy.__proto__.__proto__.__proto__

链最终返回 。null

同样在Internet Explorer中,如果没有属性,我将如何检查null?__proto__


答案 1

我最近一直试图解决这个问题,最终想出了这个“地图”,我认为它可以充分阐明这个问题。

http://i.stack.imgur.com/KFzI3.png enter image description here

我知道我不是第一个编造这个的人,但找到它更有趣:-)。无论如何,在那之后,我发现了例如这个另一个图表,我认为它基本上是一样的:

Javascript 对象布局

对我来说最令人惊讶的是发现它指向,而不是,但我相信有一个很好的理由:-)Object.__proto__Function.prototypeObject.prototype

我将图像中提到的代码也粘贴在这里,以便有人想要测试它。请注意,一些属性被添加到对象中,以便于在一些跳跃后知道我们在哪里:

Object.O1='';
Object.prototype.Op1='';

Function.F1 = '';
Function.prototype.Fp1 = '';

Cat = function(){};
Cat.C1 = '';
Cat.prototype.Cp1 = '';

mycat = new Cat();
o = {};

// EDITED: using console.dir now instead of console.log
console.dir(mycat);
console.dir(o);

答案 2

constructor是函数对象的属性所指向的对象的预定义 [[DontEnum]] 属性,并且最初将指向函数对象本身。prototype

__proto__等效于对象的内部 [[Prototype]] 属性,即其实际原型。

使用运算符创建对象时,其内部 [[Prototype]] 属性将设置为构造函数属性所指向的对象。newprototype

这意味着将计算为,即用于创建对象的构造函数,并且正如我们所了解的,此函数的属性用于设置对象的[[Prototype]]。.constructor.__proto__.constructorprotoype

因此,这与(只要这些属性未被覆盖)相同;有关更详细的说明,请参阅此处.constructor.prototype.constructor.constructor

如果可用,您可以遍历对象的实际原型链。在普通的 ECMAScript3 中没有办法做到这一点,因为 JavaScript 不是为深度继承层次结构而设计的。__proto__