2015-02-17 38 views
1

我没有正确地把这个放到我的头上。我看到了一个与之相关的问题,但却无法从中得到任何答案。是在constructor.prototype!= __。proto .__ in javascript?

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链?
+0

'sha .__ proto__ === Shane.prototype',但'Shane.prototype!== Shane.constructor.prototype'因此..(从那里开始;也如所示,将抛出一个TypeError - 未定义的异常。) – user2864740 2015-02-17 22:24:46

+1

@ user2864740想说:'sha .__ proto__ === Shane.prototype'但是'Shane.prototype .__ proto__!== Shane.prototype.constructor.prototype'! – Bergi 2015-02-17 23:31:59

+0

@Bergi这不是重复的。问题实际上是关于原型的构造函数。 – freakish 2015-02-17 23:40:33

回答

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 

非常微妙differnce远高于远的物体。 :)

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

+1

好吧,显然第二个不是有效的方式来访问原型链,所以我认为只有我们有一个? – Bergi 2015-02-17 23:33:08

+0

@Bergi你是什么意思的“不是一个有效的方式”?如果它受到所有js引擎的支持(实际上我不知道),那么我认为它没有任何问题。再加上上面的观察证明,你不能通过'.constructor.prototype'得到更高级别的原型,这意味着它实际上是正确的方式。 – freakish 2015-02-17 23:36:55

+1

是的,你不能进入“更高级别的原型”,即你*无法访问链* - 这不是一个有效的方式来做你想要的。我不知道那将是“正确的”。 – Bergi 2015-02-17 23:41:06