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