Object.defineProperty


Object.defineProperty(obj,prop,descriptor) 定义对象中新属性或修改原有的属性

  • obj:必需。目标对象
  • prop:必需。需定义或修改的属性的名字
  • descriptor:必需。目标属性所拥有的特权 — 以 对象形式 {} 书写

    • value:设置属性的值 默认为 undefined
    • writable:值是否可以重写。 true | false 默认为false
    • enumerable:目标属性是否可以被枚举,默认为false
    • configurable:目标属性是否可以被删除或是否可以再次修改特性,默认为false

基本使用:

  1. // Object.defineProperty() 定义新属性或修改原有属性
  2. const obj = {
  3. id: 1,
  4. pname: '小米',
  5. price: 199
  6. };
  7. Object.defineProperty(obj,'num',{
  8. value: 1000
  9. /*虽然没有加 enumerable 但是默认是 false 所以也没法遍历出来*/
  10. })
  11. Object.defineProperty(obj,'price', {
  12. value: 9.9
  13. })
  14. console.log(obj)
  15. Object.defineProperty(obj,'id', {
  16. writable: false
  17. })
  18. obj.id = 2
  19. console.log(obj)
  20. Object.defineProperty(obj, 'address', {
  21. value: '中国山东蓝翔',
  22. // 如果只为 false 不允许修改这个属性值,默认值也是 false
  23. writable: false,
  24. // 如果值为 false 则不允许遍历,默认值是 false
  25. enumerable: false,
  26. // 如果为 false 则不允许删除这个属性 默认为 false
  27. configurable: false
  28. })
  29. console.log(obj) //{id: 1, pname: "小米", price: 9.9, num: 1000, address: "中国山东蓝翔"}
  30. console.log(Object.keys(obj)) // (3) ["id", "pname", "price"]
  31. delete obj.address
  32. delete obj.pname
  33. console.log(obj) //{id: 1, price: 9.9, num: 1000, address: "中国山东蓝翔"}
  34. Object.defineProperty(obj, 'address', {
  35. value: '中国山东蓝翔',
  36. // 如果只为 false 不允许修改这个属性值,默认值也是 false
  37. writable: true,
  38. // 如果值为 false 则不允许遍历,默认值是 false
  39. enumerable: true,
  40. // 如果为 false 则不允许删除这个属性 默认为 false 不允许再次修改参数里面的特性 默认为 false
  41. configurable: true
  42. })
  43. console.log(obj.address) // 报错 Cannot redefine property: address at Function.defineProperty