您现在的位置是:首页 > 文章详情

JavaScript使用原型判断对象类型

日期:2018-10-18点击:438

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高级程序设计(第三版)》

原文链接:https://yq.aliyun.com/articles/656399
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章