js学习笔记(instanceof、hasOwnProperty、isPrototypeOf)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值