说到这两个属性,那不得不说一下_proto_这个属性,一般这个属性是隐藏属性,是不容许被暴露的,而某些浏览器为了开发者可以很好的理解,而将这个属性暴露出来,好比Mozilla FireFox,这就是为何有些同窗在个人上一节文章测试代码的时候打印不出来了。
不扯远了,先来看一下instanceof 这个关键字,学过java相似的高级语言都应该知道吧 instancaof是用来检测这个实例是否是由这个类所建立的,换言之,就是检测这个实例对象是否是这个类new出来的。
看一段代码java
function A(){}; var a = new A(); alert(a instanceof A);
你会发现alert出来的是true ,这正是体现了instanceof的做用了。
接下来咱们改动一下_proto_浏览器
function A(){}; var a = new A(); a.__proto__ = {}; alert(a instanceof A);
咱们让a._proto_指向了一个空对象,而下面alert出来的倒是false了,到这里咱们就大概知道了instanceof的做用了,instanceof就是用来检测当前对象是否在原型链上的关键字,换言之,就是用来检测当前对象的_proto_属性是否指向了建立它的对象的prototype所指向的那块内存。因此这里就很好解释了,为何更改了一下_proto_就可使结果变为false。
画个示意图,其实这个很好理解的
测试
function A(){}; var a = new A(); alert(a.constructor);
接下来你会在屏幕上看到function A(){}; 这就是constructor 这个属性的做用了
这样看来的话它和 instanceof 关键字确实有些相像,但是若是你仔细观察的话你会发现constructor只是个属性,而就于js而言,属性值是能够随时改变的,因此说,constructor具备不肯定性,可是一般的话这个值是指向建立当前实例的对象的
而instanceof只返回一个boolean类型的值,没法获取建立当前实例的对象,因此利用constructor可使建立当前实例的对象暴露出来,从而能够对它进行修改。prototype