1

判断对象类型的方法

使用原型对象上的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

jhhfft
590 声望40 粉丝

Write the Code. Change the World.