这道题考了原型链,不好用文字描述,所以就画了一些图来帮助理解
试写出程序运行结果
|
|
分析:
程序执行到第5行,
B()
实际上返回一个A的实例,所以A.prototype
指向了一个A的实例,我们暂且称这个A的实例为实例A1。注意,此时A.prototype
不再指向原生的A.prototype
。但原生的A.prototype
还存在,并不会被垃圾回收机制回收,因为它还被实例A1._proto_
指向着。示意图如下:程序执行到第6行,
new B()
同样返回一个A的实例,我们成为实例A2,此时B.prototype
指向了实例A2,然后实例A2的_proto_
指向了谁呢,指向了实例A1!因为在第一步我们已经说过,构造函数A.prototype
指向了实例A1。示例图如下:再看第7行,
new A()
再次生成一个A的实例,这个实例为a。第8行,再次返回一个A的实例(前面已经说过,new B()
其实就是new A()
) 。最后的示例图如下:所以由图3可以看出:
console.log(a instanceof A)
为true
。- 要判断最后三条语句,我们要明白
instanecof
的判断队则是什么,可以参考王福明的
深入理解javascript原型和闭包(5)——instanceof,这里直接给出答案:123console.log(a instanceof A); //trueconsole.log(a instanceof B); //falseconsole.log(b instanceof A); //true