本文已参与「新人创作礼」活动,一起开启掘金创作之路。
instanceOf
- 语法:
objectinstanceofconstructor
- object:某个实例对象
- constructor:某个构造函数
- 解释: 用来检测
constructor.prototype是否存在于参数object的原型链上。
Object.setPrototypeOf
- 语法:Object.setPrototypeOf('现有对象','原型对象')
- 解释: 为
现有对象设置原型,返回一个新对象。
Object.getPrototypeOf
- 语法:Object.getPrototypeOf('对象')
- 解释: 查找
对象的原型,返回一个该原型
X.isProrotypeOf
- 语法:X.isProrotypeOf('对象')
- 解释: 查找
对象的原型是否在X上,返回一个该原型
in
- 语法:
属性inobject
- 属性:对象的属性
- 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直接添加自定义的属性或方法,这种属于滥用,切记!