isPrototypeOf、instanceof、hasOwnProperty函数整理
isPrototypeOf
作用:检测一个对象是否是另一个对象的原型。或者说一个对象是否被包含在另一个对象的原型链中
1 2 3 4 | 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
;
1 2 3 4 5 | function Animal(){ this .species = "动物" ; }; var eh = new Animal(); Animal.prototype.isPrototypeOf(eh) //=>true |
以上实例是通过new
创建了对象eh
,使用构造函数Animal
的prototype
作为它的原型。
综合上面的两个例子,我们发现在调用isPrototypeOf()
的时候有三种方式
1 2 3 | p.isPrototypeOf(o); //=>true Object.prototype.isPrototypeOf(p); Animal.prototype.isPrototypeOf(eh) //=>true |
总结一下就是:
通过Object.create()
创建的对象使用第一个参数作为原型
通过对象直接量的对象使用Object.prototype
作为原型
通过new
创建的对象使用构造函数的prototype
属性作为原型
instanceof
instanceof运算符希望左操作数是一个对象,右操作数标识对象的类。如果左侧对象是右侧类的实例,则表达式返回为true,否则返回false。
1 2 3 | var d = new Date(); d instanceof Date; //=>true d是Date的实例 d instanceof Object; //=>true 所有对象都是Object的实例 |
当通过instanceof判断一个对象是否是一个类的实例的时候,这个判断也会包含对父类的检测。尽管instanceof的右操作数是构造函数,但计算过程实际是检测了对象的继承关系。
instanceOf与isPrototypeOf简单总结
1 2 3 | 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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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 } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?