文档章节

JavaScript使用原型判断对象类型

Bob2100
 Bob2100
发布于 2018/10/19 21:18
字数 700
阅读 9
收藏 0

1. constructor属性

在JavaScript创建对象(二)——构造函数模式中,我们说过可以使用对象的constructor属性判断对象的类型:p1.constructor === Person,可能当时就有细心的读者会想,我们并没有给这个对象添加过constructor,这个属性是从哪儿来的呢?讲过原型之后,我们知道这个属性是原型中的,所以一般重写原型时也都会把constructor补上。

我们可以通过像下面的代码一样,切断实例与原型的关系:

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
}

Person.prototype = {
    constructor: Person,
    sayName: function(){
        console.log(this.name);
    }
}

var p1 = new Person('张三', 18, 'JavaScript');
var p2 = new Person('李四', 20, 'Java');

//切断p1与Person原型的关系
p1.__proto__ = null;

console.log(p1.constructor === Person);//false
console.log(p2.constructor === Person);//true

如代码所示,切断p1Person原型的关系后,p1.constructor === Person的结果为falseconstructor属性失效了。

工厂模式没办法使用这种方法判读对象的类型,为什么呢?因为使用工厂模式创建的对象本质上只是一个Object类型,它们的constructor属性都是Object,所以没办法通过constructor区分对象的类型。

2. instanceof关键字

之前我们还使用过instanceof判断对象的类型,该方法不仅可以判断对象本身的类型,还能判断出父类型,其实这个关键字也是依赖原型的。还是以上述p1为例,看下面代码:

console.log(p1 instanceof Person);//false
console.log(p1 instanceof Object);//false

如代码所示,p1的原型被置为null后,instanceof也失效了。

3. isPrototypeOf()方法

这是原型对象上的一个方法,用于判断对象的原型。那么问题又来了,我们明明重写了Person的原型,并且也没有声明isPrototypeOf()方法,这个方法是从哪来的呢?这就涉及到原型链的知识了,以后再讲。仍然以上述p1p2为例,看下面代码:

console.log(Person.prototype.isPrototypeOf(p1));//false
console.log(Person.prototype.isPrototypeOf(p2));//true

如代码所示,p1切断了与原型的关系,结果为falsep2的原型就是Person.prototype,结果为true。

4. getprototypeof()方法

这是Object上的一个方法,可以直接获取到实例的原型对象,看下面代码:

console.log(Object.getPrototypeOf(p1) === Person.prototype);//false
console.log(Object.getPrototypeOf(p1));//null
console.log(Object.getPrototypeOf(p2) === Person.prototype);//true
console.log(Object.getPrototypeOf(p2));//{constructor: ƒ, sayName: ƒ}

p1的原型被设置为了null,获取的结果也就是nullp2正常获取到了原型。

本文参考《JavaScript高级程序设计(第三版)》

© 著作权归作者所有

共有 人打赏支持
Bob2100
粉丝 16
博文 72
码字总数 33339
作品 0
浦东
高级程序员
私信 提问
JavaScript instanceof 运算符深入剖析

随着 web 的发展,越来越多的产品功能都放在前端进行实现,增强用户体验。而前端开发的主要语言则是 JavaScript。学好 JavaScript 对开发前端应用已经越来越重要。在开发复杂产品中,需要使用...

IBMdW
2013/06/14
356
1
如何理解JavaScript的原型和原型链?

之前有朋友在公众号给我留言,问问怎么去理解原型和原型链的问题。这个问题,在面试中,很多同学经常都会遇到。 回复多了,觉得大家对这块知识点理解还是不够深。于是决定今天来给大家讲讲,...

WEB开发阿靖
2018/12/07
0
0
26个精选的JavaScript面试问题

译者按: 从各个平台精选整理出26道由浅入深的题目助你面试 原文: Top 26 JavaScript Interview Questions I Wish I Knew 译者: Fundebug 为了保证可读性,本文采用意译而非直译。另外,本文...

Fundebug
2018/10/31
0
0
Node.js Interview ---- 类型判断

Node.js Interview ---- 类型判断 基本数据类型: Number,String,Boolean,Undefined,Null,Symbol 复杂数据类型: OBject console.log("aa" == true) // false const a = {i: 1,toString: funct......

Even
2018/10/05
0
0
JS中isPrototypeOf 和hasOwnProperty 的区别

JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别 JS中isPrototypeOf 和hasOwnProperty 的区别 1、isPrototypeOf isPrototypeOf是用来判断指......

Jack088
2018/08/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《傲慢与偏见》的读书笔记与读后感作文2400字

《傲慢与偏见》的读书笔记与读后感作文2400字: 作者:孙苑馨;笔者按:读书这个习惯是我爸妈养出来的。小时候父母赚的钱除了吃饭穿衣剩下的就是买书了,他们除了买各种新鲜出版的文艺派图书...

原创小博客
28分钟前
2
0
oozie job 的挂了监控报警或重启

oozie Coordinator 的job 和actioni状态很多,但好像不支持设置某状态如failed后30分钟后自动重新拉启,因他的条件只有几种:触发条件可以是一个时间频率、一个dataset实例是否可用,或者可能...

hblt-j
46分钟前
1
0
python精简笔记-[6]-[if,for,while]语句

1.if 条件判断 语法: if 判断条件: 执行语句……elif 判断条件:    执行语句……elif 判断条件:    执行语句……else: 执行语句…… 实例1: n = input("请输...

平头哥-Enjoystudy
49分钟前
1
0
RxJava 是如何实现线程切换的(上)

前言 通过前一篇的从观察者模式出发,聊聊RxJava,我们大致理解了RxJava的实现原理,在RxJava中可以非常方便的实现不同线程间的切换。subscribeOn 用于指定上游线程,observeOn 用于指定下游线...

亭子happy
今天
2
0
想晋级高级工程师只知道表面是不够的!Git内部原理介绍

本文由云+社区发表 作者:腾讯工蜂用户:王二卫 从不一样的视角了解git,以便更好的使用git 一、git & git 版本库认识 git 是一个内容寻址的文件系统,其核心部分是一个简单的键值对数据库(...

腾讯云加社区
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部