我们知道,instanceof运算符是用来检查一个对象是否是一个构造函数的实例。下面是一个列表的各种场景,它返回TRUE。

1、通过新的构造函数创建对象,然后对象实例构造函数是真实的
复制代码代码如下所示:
函数人(n,a){
this.name = N;
this.age =一;
}
var p =新的人(约翰巴科斯,82);
console.log(P是人); / /真的

2。如果一个遗传有关系,那么子类的实例是母公司将返回真
复制代码代码如下所示:
函数(a){
函数(b){ }
b.prototype =新(一); / / B继承

新的b();
console.log(B是A); / /真的

3,因为对象是根类,所有其他的自定义类继承,所以任意构造函数、实例对象的实例,返回TRUE
复制代码代码如下所示:
函数(a){
var =新的a();
console.log(一个实例对象); / /真的

var str =新的字符串(你好);
console.log(str实例对象); / /真的

新数字(1);
console.log(Num实例对象); / /真的

甚至构造函数本身
复制代码代码如下所示:
函数(a){
console.log(一个实例对象); / /真的
console.log(String实例对象); / /真的
console.log(数字实例对象); / /真的

4。所有的构造函数是函数返回TRUE
复制代码代码如下所示:
函数(a){
console.log(一个是功能); / /真的
console.log(String实例功能); / /真的
console.log(数是函数); / /真的

用一句话来概括上述四点:如果一个实例的类或其子类创建的实例,然后返回真。或构造函数的原型存在于这个对象的内部原型链,然后返回TRUE,instanceof结果不是构造函数本身直接相关。在许多语言中这是常见的。

一类人是指在java,并且实例P返回真个人与对象
复制代码代码如下所示:
类人{
公用字符串名;
公共年龄;
Person (String n, int a) {
this.name =名称;
this.age =一;
}
public static void main(String { } args){
人P =新的人(John Backus
System.out.println(P是人); / /真的
System.out.println(P实例对象); / /真的
}
}

如果有继承的子类的实例是java,然后家长也回到了真实
复制代码代码如下所示:
父类
类人{
公用字符串名;
公共年龄;
人(String,int){
名称=名称;
年龄=;
}
}
子类
公共类的人扩展{
公立弦大学;
人(字符串n,int,字符串s){
超级(N,A);
大学=;
}
public static void main(String { } args){
男人毫米=新的人(John Resig
System.out.println(MM是男人); / /真的
System.out.println(MM是人); / /真的
}
}

知道了这一点,JS中的以下表现就不足为奇了。
复制代码代码如下所示:
定义两个构造函数
函数(a){
函数(b){ }
a.prototype = b.prototype = { 1 };

分别创建两个不同的实例构造函数
var =新的a();
新的b();
console.log(A是B); / /真的
console.log(B是A); / /真的

我们看到,B,A和B分别创造的,但一个是B和B是一个是真实的,虽然不是用构造函数B创建,它还是回到真实的。因为在A的内部原型链存在b.prototype

因为JS的动态语言的特性,它可以在运行时修改原型,所以这并不奇怪,返回false下面。链中断因为a.prototype不再是A的内部原型链
复制代码代码如下所示:
函数(a){
var =新的a();
a.prototype = {}; / /动态修改原型,注意一定要在建立一个支付
console.log(一个是一个); / /假

请注意,这也打破了第一篇总结以上:对象是通过新的构造函数创建对象实例的构造函数,然后是真的

实际上,在ECMAscript标准(5.1),构造函数的内部实现,hasinstance } { { },在中实现的,描述如下



如果f是一个函数对象,当执行f(V)时,将执行以下步骤:

1。如果是左运算单元V不是一个对象类型,它直接返回false
复制代码代码如下所示:
VaR,B = 1,C = true,D =你好;
console.log(一个实例对象); / /假凡值定义
console.log(B实例对象); / /假
Console.log(C实例对象); / /假
console.log(D实例对象); / /假

2 / 3,构造函数的原型属性F,如果不是对象类型的必须抛出TypeError异常。
复制代码代码如下所示:
函数(a){
a.prototype = 1; / /非对象类型的一个原型
var =新的a();
console.log(一个是一个);

浏览器抛出的异常提示是不同的。


firefox18:



chrome24:



safari6:



opera12:



IE10:



4,继续执行以下逻辑:v将V设置为内部原型,如果v为null,返回false,如果v和o指向同一对象,则返回真值。