isprototypeof
作用:检测一个对象是否是另一个对象的原型。或者说一个对象是否被包含在另一个对象的原型链中
var p = {x:1};//定义一个原型对象 var o = object.create(p);//使用这个原型创建一个对象 p.isprototypeof(o);//=>true:o继承p object.prototype.isprototypeof(p);//=> true p继承自object.prototype
以上实例来自与《javascript权威指南》,简单解释一下就是每一个javascript
对象都和原型关联,每一个对象都从原型继承属性。所有通过对象直接量创建的对象都使用object.prototype
作为他们的原型,因此p
是继承自object.prototype
,因此在p
的原型链中一定存在object.prototype
。
上面还提到了object.create();
该方法创建一个新对象,第一个参数是这个对象的原型,所以上面创建的o
对象它的原型就是p
;
function animal(){ this.species = "动物"; }; var eh = new animal(); animal.prototype.isprototypeof(eh)//=>true
以上实例是通过new
创建了对象eh
,使用构造函数animal
的prototype
作为它的原型。
综合上面的两个例子,我们发现在调用isprototypeof()
的时候有三种方式
p.isprototypeof(o);//=>true object.prototype.isprototypeof(p); animal.prototype.isprototypeof(eh)//=>true
总结一下就是:
通过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操作符不能视为一个可靠的数组检测方法。
hasownproperty
检测集合成员的所属关系,判断某个属性是否存在于某个对象中。可以通过in运算符,hasownproperty()来完成。
in
运算符左侧是属性名,右侧是字符串,如果对象的自由属性或者继承属性中包含这个属性则返回true
。
对象的hasownproperty()
方法用来检测给定的名字是否是对象的自由属性,如果是继承属性则返回false。
function animal(){}//定义animal构造函数 animal.prototype = {//定义animal原型 species:"动物", say:function(){ console.log('i can say word'); } } function cat(name,color){//定义构造函数cat this.name = name; this.color = color; } var f = function(){}; f.prototype = animal.prototype; cat.prototype = new f(); cat.prototype.constructor = cat;//cat继承animal 用f空对象作为媒介 var eh = new cat('lili','white');//实例化对象 console.log('say' in eh)//=>true console.log('name' in eh)//=>true console.log('color' in eh)//=>true console.log('species' in eh)=>true console.log(eh.hasownproperty('say'))=>false 由于say为继承属性 非自有属性 console.log(eh.hasownproperty('species'))=>false 由于species为继承属性 非自有属性 console.log(eh.hasownproperty('name'))=>true console.log(eh.hasownproperty('color'))=>true for(var key in eh){ console.log(key); if(eh.hasownproperty(key)){ console.log(key) //=>species say name color } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持代码网。
发表评论