javascript基础学习系列一百三十九:getOwnPropertyDescriptor

用。对应的反射 API 方法为 Reflect.getOwnPropertyDescriptor()。
const myTarget = {}; 
const proxy = new Proxy(myTarget, { 
 getOwnPropertyDescriptor(target, property) { 
 console.log('getOwnPropertyDescriptor()'); 
 return Reflect.getOwnPropertyDescriptor(...arguments) 
 } 
}); 
Object.getOwnPropertyDescriptor(proxy, 'foo'); 
// getOwnPropertyDescriptor()

返回值
getOwnPropertyDescriptor()必须返回对象,或者在属性不存在时返回 undefined。
2. 拦截的操作

 Reflect.getOwnPropertyDescriptor(proxy, property)
  1. 捕获器处理程序参数
 property:引用的目标对象上的字符串键属性。
  1. 捕获器不变式
    如果自有的 target.property 存在且不可配置,则处理程序必须返回一个表示该属性存在的对象。
    如果自有的 target.property 存在且可配置,则处理程序必须返回表示该属性可配置的对象。
    如果自有的 target.property 存在且 target 不可扩展,则处理程序必须返回一个表示该属性存在的对象。
    如果 target.property 不存在且 target 不可扩展,则处理程序必须返回 undefined 表示该属性不存在。
    如果 target.property 不存在,则处理程序不能返回表示该属性可配置的对象。
    deleteProperty()
    deleteProperty()捕获器会在 delete 操作符中被调用。对应的反射 API 方法为 Reflect. deleteProperty()。
const proxy = new Proxy(myTarget, { 
 deleteProperty(target, property) { 
 console.log('deleteProperty()'); 
 return Reflect.deleteProperty(...arguments) 
 } 
}); 
delete proxy.foo 
// deleteProperty()
  1. 返回值
    deleteProperty()必须返回布尔值,表示删除属性是否成功。返回非布尔值会被转型为布尔值。
  2. 拦截的操作
 delete proxy[property]
 Reflect.deleteProperty(proxy, property)

捕获器处理程序参数

 property:引用的目标对象上的字符串键属性。

捕获器不变式
如果自有的 target.property 存在且不可配置,则处理程序不能删除这个属性。

ownKeys()。
const myTarget = {}; 
const proxy = new Proxy(myTarget, { 
 ownKeys(target) { 
 console.log('ownKeys()'); 
 return Reflect.ownKeys(...arguments) 
 } 
}); 
Object.keys(proxy); 
// ownKeys()

返回值
ownKeys()必须返回包含字符串或符号的可枚举对象。
拦截的操作

 Object.getOwnPropertySymbols(proxy)
 Object.keys(proxy)
 Reflect.ownKeys(proxy)

捕获器处理程序参数
 target:目标对象。
捕获器不变式
返回的可枚举对象必须包含 target 的所有不可配置的自有属性。
如果 target 不可扩展,则返回可枚举对象必须准确地包含自有属性键。

Reflect.getPrototypeOf()。
const myTarget = {}; 
const proxy = new Proxy(myTarget, { 
 getPrototypeOf(target) { 
 console.log('getPrototypeOf()'); 
 return Reflect.getPrototypeOf(...arguments) 
 } 
}); 
Object.getPrototypeOf(proxy); 
// getPrototypeOf()

返回值
getPrototypeOf()必须返回对象或 null。
拦截的操作

 Reflect.getPrototypeOf(proxy)
 proxy.__proto__
 Object.prototype.isPrototypeOf(proxy)
 proxy instanceof Object

捕获器处理程序参数

捕获器不变式
如果 target 不可扩展,则 Object.getPrototypeOf(proxy)唯一有效的返回值就是 Object. getPrototypeOf(target)的返回值。

Reflect.setPrototypeOf()。
const myTarget = {}; 
const proxy = new Proxy(myTarget, { 
 setPrototypeOf(target, prototype) { 
 console.log('setPrototypeOf()'); 
 return Reflect.setPrototypeOf(...arguments) 
 } 
}); 
Object.setPrototypeOf(proxy, Object); 
// setPrototypeOf()

返回值
setPrototypeOf()必须返回布尔值,表示原型赋值是否成功。返回非布尔值会被转型为布尔值。
拦截的操作

 Reflect.setPrototypeOf(proxy)

捕获器处理程序参数

 prototype:target 的替代原型,如果是顶级原型则为 null。

捕获器不变式
如果 target 不可扩展,则唯一有效的 prototype 参数就是 Object.getPrototypeOf(target)
的返回值。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值