isPrototypeOf、instanceof、hasOwnProperty函数介绍
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
}
}
isPrototypeOf、instanceof、hasOwnProperty函数介绍的更多相关文章
- 面向对象的程序设计(二)理解各种方法和属性typeof、instanceof、constructor、prototype、__proto__、isPrototypeOf、hasOwnProperty
//理解各种方法和属性typeof.instanceof.constructor.prototype.__proto__.isPrototypeOf.hasOwnProperty. //1.typeo ...
- javascript 中isPrototypeOf 、hasOwnProperty、constructor、prototype等用法
hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员. isPrototypeOf是用来判断要检查 ...
- python strip()函数 介绍
python strip()函数 介绍,需要的朋友可以参考一下 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除 ...
- PHP ob_start() 函数介绍
ob_start() 函数介绍: http://www.nowamagic.net/php/php_ObStart.php ob_start()作用: http://zhidao.baidu.com/ ...
- JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别
JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的 ...
- Python开发【第三章】:Python函数介绍
一. 函数介绍 1.函数是什么? 在学习函数之前,一直遵循面向过程编程,即根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复 ...
- row_number() OVER(PARTITION BY)函数介绍
OVER(PARTITION BY)函数介绍 开窗函数 Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个 ...
- select与poll函数介绍
select与poll函数介绍 在所有依从POSIX的平台上,select函数使我们可以执行I/O多路转接.传向select的参数告诉内核: 1)我们所关心的描述符 2)对于每个描述符我们所关心的状态 ...
- JavaScript hasOwnProperty() 函数详解
hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性.如果有,返回true,否则返回false. 该方法属于Object对象,由于所有的对象都"继承 ...
随机推荐
- Django的静态资源
如果你的静态资源是某个APP专属,那么就在这个APP目录下建立一个static目录,就像上图report这个APP中的static目录.当浏览这个APP的网页时它会从这里去找资源,当然,它首先会从共用 ...
- C#2.0导航
主要特性 泛型 类型和方法的参数化 可空类型 值类型可为null 委托 更简化的方式 迭代器 简单的foreach,不简单的状态机
- python 使用 thrift 教程
一.前言: Thrift 是一种接口描述语言和二进制通信协议.以前也没接触过,最近有个项目需要建立自动化测试,这个项目之间的微服务都是通过 Thrift 进行通信的,然后写自动化脚本之前研究了一下. ...
- python基础5--输入输出、错误与异常
1.键盘输入输出 输入:input()和raw_input() 输出:str()和format raw_input([prompt]) 函数从标准输入读取一个行,并返回一个字符串(去掉结尾的换行符): ...
- Mybatis学习(七)————— mybatis的逆向工程的配置详解
一.什么是逆向工程? 简单点说,就是通过数据库中的单表,自动生成java代码. Mybatis官方提供了逆向工程,可以针对单表自动生成mybatis代码(mapper.java\mapper.xml\ ...
- 聊聊数据库~3.SQL基础篇
上篇回顾:聊聊数据库~SQL环境篇 扩展:为用户添加新数据库的权限 PS:先使用root创建数据库,然后再授权grant all privileges on 数据库.* to 用户名@"%& ...
- [MySQL] 索引中的b树索引
1.索引如果没有特别指明类型,一般是说b树索引,b树索引使用b树数据结构存储数据,实际上很多存储引擎使用的是b+树,每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历 2.底层的 ...
- PHP的异常处理机制
1.PHP中异常的独特性 PHP中的异常的独特性,即PHP中的异常不同于主流语言C++.java中的异常.在Java中,异常是唯一的错误报告方式,而在PHP中却不是这样,而是把所有不正常的情况都视作了 ...
- 教你快速撸一个免费HTTPS证书
摘要: 免费 HTTPS 证书,了解一下? HTTPS 已成为业界标准,这篇博客将教你申请Let's Encrypt的免费 HTTPS 证书. 本文的操作是在 Ubuntu 16.04 下进行,使用 ...
- 1.SDL介绍
01.什么是SDL SDL是微软提出的一种软件开发安全生命周期管理的一种最佳安全实践,全称为Security Development Lifecycle. SDL是微软软件开发安全保障流程,结合了软件 ...