每一个JavaScript对象都和原型关联,每一个对象都从原型继承属性
作用:检测一个对象是否是另一个对象的原型。或者说一个对象是否被包含在另一个对象的原型链中
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作为它的原型
总结:
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操作符不能视为一个可靠的数组检测方法。