JavaScript使用原型判断对象类型
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
如代码所示,切断p1
与Person
原型的关系后,p1.constructor === Person
的结果为false
,constructor
属性失效了。
工厂模式没办法使用这种方法判读对象的类型,为什么呢?因为使用工厂模式创建的对象本质上只是一个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()
方法,这个方法是从哪来的呢?这就涉及到原型链的知识了,以后再讲。仍然以上述p1
、p2
为例,看下面代码:
console.log(Person.prototype.isPrototypeOf(p1));//false console.log(Person.prototype.isPrototypeOf(p2));//true
如代码所示,p1
切断了与原型的关系,结果为false
。p2
的原型就是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
,获取的结果也就是null
。p2
正常获取到了原型。
本文参考《JavaScript高级程序设计(第三版)》

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java中静态变量和实例变量的区别
Java中静态变量和实例变量的区别 在语法上的区别:静态变量前加static,实例变量不加; 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。而静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。 我们在静态main方法里创建了三个实例变量a b c,在后面创建了一个静态int变量和一个实例int变量,并在A()方法中使它们自增,最后在控制台中看到 虽然我们在控制台中看到静态变量从1变到3,但它还是这个静态变量,相反,实例变量虽然一直是1 但是它还是改变了三次。 原文地址 https://blog.csdn.net/qq_40136594/article/details/83035314
- 下一篇
不要让自己的人生输在职业规划上——自Java程序员
周到的程序员编码在傍晚回家 程序员的职业发展的路程 1.算法与导论 2.设计模式 3.如何预防颈椎病 4.如何治疗颈椎病 5.活着 6.如何转行 这看似一段程序员自黑的段子,但作为老程序员不得不说这真的不是一个段子, 程序员是一个高风险职业,很多人对自己的职业生涯没有清晰的概念,以至于最后落得不得不转行的尴尬局面,这个转行一般有两个原因,一个是技术跟不上,一个是身体吃不消。 今天正好有时间,结合自身的职业生涯规划,来分享一下个人心得,希望有人可以从中借鉴,找到自己的方向。 文中有给大家分享一些架构学习资料,有感兴趣的可以去领取。 1.选择比努力更重要 选择有两个方向,第一是选择企业,第二是选择技术方向, 这里针对不同人群,建议参考两点, 1).对于职场新人,不要过多的考虑钱的因素,要选择大企业,知名企业,这些企业的特点是,工资不低,职责分工明确,对于你的工作风格养成比较有利,最重要的是换工作比较容易。 这里有人可能蹦出来说。小公司更适合新人,可以快速培养一个人多项技能,虽然会累一点,但会学到很多东西,对于有这种思想的人,我只想说并不是你比别人会的多,你就会比别人有发展,个人认为深度比广...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Redis,开启缓存,提高访问速度