instanceof
instanceof是一个运算符,用于验证某个对象是不是某个构造函数的实例。
能够验证是不是原型链上的原型对应的构造函数的实例。
// 构造函数
function Fn () {
this.x = x;
this.y = y;
this.say = function () {
console.log('x:',this.x)
console.log('y:',this.y)
}
}
// 实例
let fn = new Fn('a', 'b');
// 判断对象fn是不是构造函数Fn的实例
console.log(fn instanceof Fn); // true
// 判断对象fn是不是来自于构造函数Object的实例
console.log(fn instanceof Object); // true
比较典型的用法就是判断一个数是不是数组。
let arr = [];
// let arr = new Array();
console.log(arr instanceof Array); // true
// 因为arr是构造函数Array new出来的
hasOwnProperty
hasOwnProperty是验证某个属性或者方法是否属于本身。
function Fn (x, y) {
this.x = x
this.y = y
this.say = function () {
console.log(x, y)
}
}
Fn.prototype = {
test: 'Fn'
}
let fnObj = new Fn(1, 3)
console.log(fnObj.x) // 1
console.log(fnObj.hasOwnProperty('x')) // true
console.log(fnObj.test) // Fn
console.log(fnObj.hasOwnProperty('test')) // false
// 因为fnObj.test是原型里面的属性,而非自身属性。
isPrototypeOf
判断当前对象是否在另外一个对象的原型链上。
function Fn1 () {
this.name = 'Fn1'
}
let fn1 = new Fn1()
function Fn (x, y) {
this.x = x
this.y = y
this.say = function () {
console.log(x, y)
}
}
Fn.prototype = fn1
let fnObj = new Fn(1, 3)
// 判断fn1是不是在fnObj的原型链上 true
console.log(fn1.isPrototypeOf(fnObj))
// 判断Fn.prototype是不是在fnObj的原型链上 true
console.log(Fn.prototype.isPrototypeOf(fnObj))
// 判断Object.prototype是不是在fnObj的原型链上 true
console.log(Object.prototype.isPrototypeOf(fnObj))
代码中,fnObj的原型链为:
console.log('一级原型:', fnObj.__proto__ === fn1, fn1 === Fn.prototype) // true true
console.log('二级原型:', fnObj.__proto__.__proto__ === Fn1.prototype) // true
console.log('三级原型:', fnObj.__proto__.__proto__.__proto__ === Object.prototype) // true
console.log('终极原型:', fnObj.__proto__.__proto__.__proto__.__proto__ === null) // true