文档章节

JavaScript使用原型判断对象类型

Bob2100
 Bob2100
发布于 10/19 21:18
字数 700
阅读 8
收藏 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
粉丝 17
博文 61
码字总数 23403
作品 0
浦东
高级程序员
私信 提问
26个精选的JavaScript面试问题

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

Fundebug
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
10/05
0
0
浅谈 instanceof 和 typeof 的实现原理

typeof 实现原理 一般被用于判断一个变量的类型,我们可以利用 来判断, , , , , , 这七种类型,这种判断能帮助我们搞定一些问题,比如在判断不是 object 类型的数据的时候,能比较清楚的告诉...

nicole_zhang
05/28
0
0
Python 与 Javascript 之比较

最近由于工作的需要开始开发一些Python的东西,由于之前一直在使用Javascript,所以会不自觉的使用一些Javascript的概念,语法什么的,经常掉到坑里。我觉得对于从Javascript转到Python,有必...

naughty
2014/05/13
0
39
细说JavaScript数据类型及转换

细说JavaScript数据类型及转换 JavaScript数据类型 1.Boolean(布尔) 布尔:(值类型)var b1=true;//布尔类型 2.Number(数字) 数值:(值类型)var n1=3.1415926;//数值类型 n1.toFixed...

开元中国2015
2015/07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

AS连接网易Mumu模拟器

1、安装模拟器 打开这个网址现在模拟器然后安装 http://mumu.163.com/ 2、安装完成后启动模拟器 3、进入模拟器安装目录 例如本机的安装目录:C:\Program Files (x86)\MuMu\emulator\nemu\vmo...

HGMrWang
3分钟前
0
0
设计要做到扩展性强还挺难的

概述 在日常开发中,有时候你的上司会跟你说,这个模块的设计扩展性要高。把这句话说出来很简单,但是要做到则非常难。导致难的其中一个因素是: 你不熟悉这个行业的业务的玩法 我举个例子来...

Sam哥哥聊技术
5分钟前
0
0
聊聊 scala 的模式匹配

一. scala 模式匹配(pattern matching) pattern matching 可以说是 scala 中十分强大的一个语言特性,当然这不是 scala 独有的,但这不妨碍它成为 scala 的语言的一大利器。 scala 的 patt...

终日而思一
6分钟前
0
0
Spring事物手动回滚

手动回滚: 方法1:在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常(现在项目的做法)...

寒风中的独狼
11分钟前
0
0
直角三角形的三角函数

sinA = a/c;A = asin(a/c); 特殊角度的三角函数值

一个小妞
18分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部