[JS] 对于原型和原型链的相关方法(instanceOf|setPrototypeOf|getPrototypeOf|isProrotypeOf|in|has

119 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

instanceOf

  • 语法:object instanceof constructor
    • object:某个实例对象
    • constructor:某个构造函数
  • 解释: 用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

Object.setPrototypeOf

  • 语法:Object.setPrototypeOf('现有对象','原型对象')
  • 解释: 为现有对象设置原型,返回一个新对象。

Object.getPrototypeOf

  • 语法:Object.getPrototypeOf('对象')
  • 解释: 查找对象的原型,返回一个该原型

X.isProrotypeOf

  • 语法:X.isProrotypeOf('对象')
  • 解释: 查找对象的原型是否在X上,返回一个该原型

in

  • 语法:属性 in object
    • 属性:对象的属性
    • object:要检测的对象
  • 解释: 用来检测 属性 是否存在于 object自身原型链上,通常不适用判断对象是否存在其属性,它会在原型链上查找,在自身上和原型链上只要查找到,就会 返回 true

x.hasOwnProperty('属性')

  • 语法:x.hasOwnProperty('属性')
    • x:要检测的对象
    • 属性:要检测的属性
  • 解释: 用来检测 属性 是否存在于 object自身上,通常适用判断对象是否存在其属性,它会在自身上查找返回 true,不会去原型链上查找

call 和 apply

  • 解释: 自身和原型链上没有的方法,但是它邻居有这个方法,借用它邻居的方法,实现自己的目的
    • 借用邻居的方法

    //比如说,现在hd 上排序方法 ,我自身和原型链上都没有,我要借用一下hd的排序
    let hd = {
    	data:[1,33,5,99,10]	
    }
    Object.serPrototypeOf(hd,{
    	max(data){ /*返回最大值*/
    		return data.sort((a,b)=> b-a)[0]
    	}
    })
    
    let me = [22,10,1,30] 
    // hd.max.apply(null,me)  这是call和apply参数的区别
    hd.max.call(null,me)  /*使用了hd原型链上的方法,但是实际参数用的是我自己的*/
    
    • DOM借用Array的方法

    //我找到一组DOM的集合,但是集合身上没有filter方法,我就借用下Array原型上的filter方法
    let btns = document.querySelectAll('buttom')
    btns = Array.prototype.filter.call(btns,item => {
    	return item ****    
    })
    console.log(btns) /*此时就是借用Array.filter方法来过滤出来的btns */
    

继承

此继承比非与其它语言的extends实现的,而是通过原型链逐级向上查找

  • 我自身原型上没有的属性方法,隔壁老王原型有,我的原型想继承老王的原型属性方法 在这里插入图片描述
  function User(){}
  User.prototype.show = (name)=>{
  	return name+'_User_show'
  }
  function Admin(){}
  Admin.prototype = Object.create(User.prototype) //Me.prototype.__proto__ = User.prototype
  Admin.prototype.role = (name)=>{
  	return name+'_Admin_role'
  }
  
  let admin = new Admin()
  console.log(admin.role('张三自身的原型'))
  console.log(admin.show('admin'))
  
  function Member(){} 
  Member.prototype = Object.create(User.prototype) //Member.prototype.__proto__ = User.prototype
  Member.prototype.role = (name)=>{ 
  		return name+'_Member_role'
  }
  
  let member = new Member()
  console.log(member.role('会员自身的原型'))
  console.log(member.show('会员'))
  
   注意
  + **Me.prototype.__proto__ = User.prototype**
  这种方式是把`Me自身`的原型继承自`User`的原型
  + **Admin.prototype = Object.create(User.prototype)**
  这种方式是`新建对象`,并把新对象的原型继承`User`的原型,`抛弃自身`的原型

温馨提示

不要在Object.prototype直接添加自定义的属性或方法,这种属于滥用,切记!