推断对象范例的要领
运用原型对象上的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