我没有正确理解这一点。我看到了一个与之相关的问题,但却无法从中得到任何结论。
function Shane(){}
var sha = new Shane();
console.log(sha.__proto.__.__proto.__.__proto.__) //null
console.log(sha.constructor.prototype.constructor.prototype.
constructor.prototype)
//Shane [Can anyone explain me what5 is happening here]
constructor.prototype != .__proto.__
?prototype
链?答案 0 :(得分:1)
__proto__
是查找链中用于解析方法的实际对象。
prototype
是用__proto__
创建new
的对象。
另外,你有一个拼写错误,它应该是.__proto__ not .__proto.__
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor
答案 1 :(得分:0)
真正回答的问题是,如果
var fn = function() { ... };
var obj = new fn();
然后
obj.__proto__ === fn.prototype
然而
fn.prototype.constructor == fn
如果fn
没有预设原型(即初始值)。这是根据规范:
http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.4
所以你观察到的是有这样的对象
obj.__proto__ !== obj.constructor.prototype
远远超过上述平等的微妙差异。 :)
至于第二个问题:历史原因+糟糕的设计。