判断对象类型的方法
使用原型对象上的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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。