提问者:自己遇到的前端面试问题,请高手来帮忙解决。其他的感兴趣的同学也可以来看看,自己能不能答对。
1 |
|
小弟对最后两个console.log的结果不明白,我觉得应该是
1 |
|
但是在浏览器中试过了,确实是上面的答案,求解,提前谢谢各位。
解答1:
首先说明 instanceof 和 constructor 没有半毛钱关系,所以题主的问题有效代码如下:
1 |
|
特别注意我添加的两个注释,对象1和对象2并非同一个对象!
再来解释instanceof,具体可以参考ECMAScript官方文档和IBM 开发者社区的解释,简而言之,instanceof运算符返回 A 的 prototype 对象是否存在 a 的原型链中。
那么上面代码就可以用下面的图示说明:
可以看到,a 的原型链上已经不存在 A 的 prototype 对象,因此console.log(a instanceof A);//false,而 b 的原型链上存在 A 的 prototype 对象,因此console.log(b instanceof A);//true
解答2:
- a instancof A 检查a的原型链中是否存在A.prototype
2)每一个js对象都有一个proto属性(标准表示[[prototype]])
proto是普通对象的隐式属性,在new的时候,会指向prototype所指的对象;new出来的对象是没有prototype属性的
proto实际上是某个对象的属性,而prototype则是属于构造函数的属性,prototype指向的是一个实体对象,也就是其有proto属性;
通过proto属性的串联构建了一个对象的原型访问链,起点为一个具体的对象,终点在Object.prototype,其proto( [[ prototype ]]) )为null
3)constrcutor 为对象的构造函数对象,存在于prototype对象(原型对象)中,只要不对prototype对象重新复制,constructor都指向构造函数自身
默认的构造函数为function object()
那么我们来分析下题目
1 |
|
解答3
首先,instanceof 到底比较的什么?
instanceof 比较的是否能在实例的原型对象链中找到 与构造函数(第二个参数)的prototype属性所指向的原型对象,能找到就返回true,反之false;方法A的原型被篡改为 Object (A.prototype = {})经过这一步之后,
实例 a.[[proto]] = function A(){}.prototype !!//注意,此时这个加粗的prototype已经变成了{}了!
而constructor是原型对象的属性,所以 a.constructor == function Object(){} !!// {}根据自身的原型链找到
A.[[proto]] = function Function(){}.prototype //
A.constructor = function Function(){} //
显然 A.constructor != a.constructor ;
下一个比较就同理了。
解答4
constructor是挂在prototype下的,当A.prototype={}的时候,constructor被删除了。所以a是false,而b又从新设置了constructor指向A,这时候b是true