在javascript中是constructor.prototype!= __。proto .__?

时间:2015-02-17 22:11:56

标签: javascript oop

我没有正确理解这一点。我看到了一个与之相关的问题,但却无法从中得到任何结论。

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]
  1. constructor.prototype != .__proto.__
  2. 为什么我们有两种方法来了解prototype链?

2 个答案:

答案 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

远远超过上述平等的微妙差异。 :)

至于第二个问题:历史原因+糟糕的设计。