美文网首页Web 前端开发 让前端飞
面向对象04 判断对象类型

面向对象04 判断对象类型

作者: IT男的成长记录 | 来源:发表于2017-05-07 11:00 被阅读0次

判断对象类型的方法

使用原型对象上的constructor属性来判断

每个对象的原型上都有一个constructor属性,指向了其构造函数
  • 注意:对象没有constructor属性(除非自己添加),constructor属性是放在原型对象上的
function Person(){
}

var person = new Person();
person.constructor === Person  // true
person.constructor === Object // false

var object = {a:1,b:2}
object.constructor === Object // true
  • 如果重写了函数的原型对象,则有可能无法使用这个方法
function Person(){
}
Person.prototype = {
}
var p1 = new Person()
p1.constructor === Person //false
  • 如果希望可以使用这种方法,则可以给新的原型对象设置constructor属性
function Person(){
}
Person.prototype = {
    constructor: Person
}
var p1 = new Person()
p1.constructor === Person // true
  • 使用constructor属性来判断对象类型(结合上面最后的方法)的优点是:无论如何修改构造函数的原型对象,之前创建的对象的constructor属性一定指向构造函数,因此一定可以判断出他们的类型

使用instanceof 运算符

instanceof运算符用来测试一个对象在其原型链中是否存在一个构造函数的原型对象(通俗的讲就是判断一个对象的原型链上是否存在一个构造函数的原型对象)

function Person(){
}

var person = new Person();
person instanceof Person  // true
person instanceof Object // true

var object = {a:1,b:2}
object instanceof Object // true
  • 注意:如果重写了构造函数的原型对象,则会出现无法判断(之前创建的)对象是否属于该类型: 因为重写了构造函数的原型对象,而(之前创建的)对象的原型链中仍然是之前构造函数的原型对象
function Person(){
}

var p1 = new Person()
p1 instanceof Person // true

Person.prototype = {
    name: 'aaa',
    age: '20'
}
// p1是修改构造函数原型对象之前创建的对象
// p1的__proto__仍然指向原来的原型对象
p1 instanceof Person // false

// p2是修改构造函数原型对象之后创建的对象
var p2 = new Person()
p2 instanceof Person // true

使用Object.getPrototypeOf()方法

Object.getPrototypeof()可以获取对象的原型。这种方法也存在这样的问题:如果修改了构造函数的原型对象,之前创建的对象无法通过这种方式来确定类型

function Person(){
}

var p1 = new Person()
Object.getPrototypeOf(p1) === Person.prototype // true
Object.getPrototypeOf(p1) === Object.prototype // false

Person.prototype = {
    name: 'aaa',
    age: '20'
}
// p1是修改构造函数原型对象之前创建的对象
// p1的__proto__仍然指向原来的原型对象
Object.getPrototypeOf(p1) === Person.prototype // false

// p2是修改构造函数原型对象之后创建的对象
var p2 = new Person()
Object.getPrototypeOf(p2) === Person.prototype // true

使用isPrototypeOf()方法

isPrototypeOf()方法可以判断一个对象是否存在于另一个对象的原型链上。这种方法也存在这样的问题:如果修改了构造函数的原型对象,之前创建的对象无法通过这种方式来确定类型

function Person(){
}
var p1 = new Person()
Person.prototype.isPrototypeOf(p1) // true
Object.prototype.isPrototypeOf(p1) //true

Person.prototype = {
}
Person.prototype.isPrototypeOf(p1) // false
Object.prototype.isPrototypeOf(p1) //true

var p2 = new Person()
Person.prototype.isPrototypeOf(p2) // true
Object.prototype.isPrototypeOf(p2) //true
  • 修改构造函数的原型对象会导致之前创建的对象无法通过这种方式判断类型

判断对象继承自哪些父类型

使用instanceof
instance instanceof Object //true
instance instanceof SuperType // true
instance instanceof SubType //true
使用isPrototypeOf
Object.prototype.isPrototypeOf(instance) // true
SuperType.prototype.isPrototypeOf(instance) // true
SubType.prototype.isPrototypeOf(instance) // true

相关文章

  • 面向对象04 判断对象类型

    判断对象类型的方法 使用原型对象上的constructor属性来判断 每个对象的原型上都有一个constructo...

  • JS面向对象精要(二)_函数

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • JS面向对象精要(三)_理解对象

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • JS面向对象精要(四)_构造函数和原型对象

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • JS面向对象精要(五)_继承

    JS面向对象精要(一)_原始类型和引用类型JS面向对象精要(二)_函数JS面向对象精要(三)_理解对象JS面向对象...

  • NodeJs实用技巧

    判断数组类型为 Array 判断对象类型为 Object 判断对象类型为 Number

  • 对象和面向对象的介绍

    对象分为 面向对象和基于对象: 面向对象:面向对象定义: 可以创建自定义类型、很好的支持继承和多态。面向对象的语言...

  • 设计类型

    设计类型 一、类型基础 常见问题 面向对象语言的特点? 什么是面向对象语言面向对象语言(Object-Orient...

  • 对象

    1.对象分为值类型和引用类型 值类型(不是对象) 引用类型(都是对象) 类型的判断值类型判断用typeof引用类型...

  • Swift--Swift语言中的面向对象特性

    Swift语言中的面向对象类型 枚举 结构体 类 可选链 访问限定 Swift语言中的面向对象类型 面向对象概念的...

网友评论

    本文标题:面向对象04 判断对象类型

    本文链接:https://www.haomeiwen.com/subject/iadutxtx.html