据我所知,下面的第二个案例应该是真的,但事实上它是错误的。那么为什么不是这样呢?
案例1
var P = function(){};
P.prototype.get = function(){};
var p = new P,q = new P;
console.log(q.__proto__ === p.__proto__) //true
案例2
var PP = function(){
var P = function(){};
P.prototype.get = function(){};
return new P;
};
var p = PP(), q = PP();
console.log(q.__proto__ === p.__proto__) //false
答案 0 :(得分:3)
在第一种情况下,P
和get()
是预定义的全局变量。在第二个中,它们是定义PP的函数的本地,因此,每个实例都有不同的引用。
答案 1 :(得分:2)
在顶部,您有一个new P
。
在第二个中,您在函数中有new P
,然后使用该函数的new
。
这可能搞砸了。
没关系,这是因为全球变量,就像他说的那样。
答案 2 :(得分:2)
在第一种情况下var p = new P,q = new P;
都实例化了全局P
并且它是原型,所以它返回true。
在第二种情况下,q
和p
都是使用new PP
实例化的不同对象,使用P
从PP
函数内部返回了不同的return new P
}。所以它返回false。
答案 3 :(得分:2)
当您调用PP
函数时,每次调用P
时都会创建一个新的函数对象。这些功能中的每一个都有不同的原型。