markdown JS isPrototypeOf和instanceof函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown JS isPrototypeOf和instanceof函数相关的知识,希望对你有一定的参考价值。

每一个JavaScript对象都和原型关联,每一个对象都从原型继承属性

### isPrototypeOf

>作用:检测一个对象是否是另一个对象的原型。或者说一个对象是否被包含在另一个对象的原型链中

```
var p = {x:1};//通过字面量方式定义一个原型对象, 也可以使用 new 方式: new Object({x : 1}) 或 Object({x : 1})//与加new等效

//所有通过字面量方式创建的对象都使用Object.prototype作为他们的原型 p.__proto__ === Object.prototype
//因此p是继承自Object.prototype
//因此在p的原型链中一定存在Object.prototype
Object.prototype.isPrototypeOf(p);//=> true p继承自Object.prototype

var o = Object.create(p);//使用这个原型创建一个对象

//Object.create();该方法创建一个新对象,第一个参数是这个对象的原型
//所以上面创建的o对象它的原型就是p
p.isPrototypeOf(o);//=>true:o继承p
```

```
function Animal(){
    this.species = "动物";
};
var eh = new Animal();
Animal.prototype.isPrototypeOf(eh)//=>true

//以上实例是通过new创建了对象eh,使用构造函数Animal的prototype作为它的原型
```

>总结:
- 通过 Object.create() 创建的对象以第一个参数为原型
- 通过字面量方式创建的对象以 Object.prototype 为原型
- 通过 new 方式创建的对象使用构造函数的prototype属性作为原型

### instanceof

instanceof运算符希望左操作数是一个对象,右操作数标识对象的类。如果左侧对象是右侧类的实例,则表达式返回为true,否则返回false。

```
var d = new Date();
d instanceof Date;//=>true  d是Date的实例
d instanceof Object;//=>true 所有对象都是Object的实例
```

当通过instanceof判断一个对象是否是一个类的实例的时候,这个判断也会包含对父类的检测。
尽管instanceof的右操作数是构造函数,但计算过程实际是检测了对象的继承关系。

instanceOf与isPrototypeOf简单总结

```
var d = new Date();
Date.prototype.isPrototypeOf(d);//=>true
d instanceof Date;//=>true
```

如果Date.prototype是d的原型,那么d一定是Date的实例。
缺点为无法同对象来获得类型,只能检测对象是否属于类名
在多窗口和多框架的子页面的web应用中兼容性不佳。其中一个典型代表就是instanceof操作符不能视为一个可靠的数组检测方法。

以上是关于markdown JS isPrototypeOf和instanceof函数的主要内容,如果未能解决你的问题,请参考以下文章

JS中isPrototypeOf 和hasOwnProperty 的区别

JS中isPrototypeOf 和hasOwnProperty 的区别

JS 构造函数——判断父对象是否在子对象的原型链上

isPrototypeOf和 instanceof 的区别

hasOwnProperty与isPrototypeOf

isPrototypeOf&&getPrototypeOf