当前位置:   article > 正文

Object.defineProperty() 方法的使用._object.defineproperty怎么用

object.defineproperty怎么用

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

语法:  Object.defineProperty(obj, prop, descriptor)

  参数:   参数1:  要定义属性的对象

             参数2:  要定义或修改的属性的名称或Symbol

             参数3:  要定义或修改的属性描述符

  返回值:   返回传递给函数的对象.sdf

配置项:

  1. const object1 = {
  2. name: 999
  3. };
  4. Object.defineProperty(object1, 'property1', {
  5. configurable: true, //该属性的描述符是否能够改变,默认为false
  6. value: 42, //属性名称的值.默认undefined
  7. writable: true, //可读,可写,为true时,value的值才能被改变,默认false
  8. enumerable: true, //是否可枚举,默认为false
  9. // get 属性的getter函数,没有则为undefined,访问该属性时,会调用此函数.
  10. get() { return xxx }
  11. // set 属性的setter函数,没有则为undefined,当属性值被修改时,调用此函数,
  12. 该方法接受一个参数(也就是被赋予的新值)
  13. set(newValue) { xxx = newValue }
  14. });
  15. var obj = {};
  16. //方法1:
  17. // var descriptor = Object.create(null); // 没有继承的属性
  18. // // 默认没有 enumerable,没有 configurable,没有 writable
  19. // descriptor.value = 'static';
  20. // Object.defineProperty(obj, 'key', descriptor);
  21. //方法2:
  22. // 显式
  23. // Object.defineProperty(obj, "key", {
  24. // enumerable: false,
  25. // configurable: false,
  26. // writable: false,
  27. // value: "static"
  28. // });
  29. // console.log(obj)
  30. //方法3:
  31. // 循环使用同一对象
  32. function withValue(value) {
  33. return {
  34. enumerable: false,
  35. writable: false,
  36. configurable: false,
  37. value
  38. };
  39. }
  40. // ... 并且 ...
  41. Object.defineProperty(obj, "key", withValue("static"));

Writable属性:

当 writable 属性设置为 false 时,该属性被称为“不可写的”。它不能被重新赋值。

  1. var o = {}; // 创建一个新对象
  2. Object.defineProperty(o, 'a', {
  3. value: 37,
  4. writable: false
  5. });
  6. console.log(o.a); // 37
  7. o.a = 25; // "TypeError: Cannot assign to read only property 'a' of object
  8. '#<Object>'"

Enumerable属性:

enumerable定义了对象的属性是否可以在for...in和Object.keys()中被枚举.

  1. var o = {};
  2. Object.defineProperty(o, "a", { value : 1, enumerable: true });
  3. Object.defineProperty(o, "b", { value : 2, enumerable: false });
  4. Object.defineProperty(o, "c", { value : 3 }); // enumerable 默认为 false
  5. o.d = 4; // 如果使用直接赋值的方式创建对象的属性,则 enumerable 为 true
  6. for (var i in o) { console.log(i) } //返回a,d

Configurable属性:

configurable 特性表示对象的属性是否可以被删除,以及除 value 和 writable 特性外的其他特性是否可以被修改。

  1. var o = {};
  2. Object.defineProperty(o, 'a', {
  3. get() { return '999' },
  4. // value: '88', //报错
  5. // enumerable: true, //报错
  6. configurable: false
  7. })
  8. console.log(o.a)
  9. delete o.a //报错:"TypeError: Cannot delete property 'a' of #<Object>"
  10. console.log(o.a)

添加多个属性和默认值:

  1. var o = {};
  2. o.a = 1;
  3. // 等同于:
  4. Object.defineProperty(o, "a", {
  5. value: 1,
  6. writable: true,
  7. configurable: true,
  8. enumerable: true
  9. });
  10. // 另一方面,
  11. Object.defineProperty(o, "a", { value : 1 });
  12. // 等同于:
  13. Object.defineProperty(o, "a", {
  14. value: 1,
  15. writable: false,
  16. configurable: false,
  17. enumerable: false
  18. });

自定义Setters和Getters

  1. function Archiver() {
  2. var temperature = null;
  3. var archive = [];
  4. Object.defineProperty(this, 'temperature', {
  5. get: function() {
  6. return temperature;
  7. },
  8. set: function(value) {
  9. temperature = value;
  10. archive.push({ val: temperature });
  11. }
  12. });
  13. this.getArchive = function() { return archive; };
  14. }
  15. var arc = new Archiver();
  16. arc.temperature = 11;
  17. console.log(arc.temperature) // 'get!' 11
  18. arc.temperature = 13;
  19. console.log(arc.temperature) // 'get!' 13
  20. console.log(arc.getArchive()); // [{ val: 11 }, { val: 13 }]

继承属性:

如果访问者的属性是继承的,它的get和set方法会在子对象的属性被访问或修改时被调用.

如果这些方法用一个变量存值,该值会被所有对象共享.

  1. function myClass() {
  2. }
  3. var value;
  4. Object.defineProperty(myClass.prototype, "x", {
  5. get() {
  6. return value;
  7. },
  8. set(x) {
  9. value = x;
  10. }
  11. });
  12. var a = new myClass();
  13. var b = new myClass();
  14. a.x = 1;
  15. console.log(b.x); // 1

这可以通过将值存储在另一个属性中解决.

在get个set方法中,this指向某个被访问和修改属性的对象.

  1. function myClass() {
  2. }
  3. Object.defineProperty(myClass.prototype, "x", {
  4. // 这里this指向myClass
  5. get() {
  6. return this.stored_x;
  7. },
  8. set(x) {
  9. this.stored_x = x;
  10. }
  11. });
  12. var a = new myClass();
  13. var b = new myClass();
  14. a.x = 1;
  15. console.log(b.x); // undefined

不想访问者属性,值属性始终在对象自身上设置,而不是一个原型.

然而,如果一份不可写的属性被继承,它仍可以防止修改对象的属性.

  1. function myClass() {
  2. }
  3. myClass.prototype.x = 1;
  4. Object.defineProperty(myClass.prototype, "y", {
  5. writable: false,
  6. value: 1
  7. });
  8. var a = new myClass();
  9. a.x = 2;
  10. console.log(a.x); // 2
  11. console.log(myClass.prototype.x); // 1
  12. a.y = 2; // 报错: 不能为对象的只读属性赋值
  13. console.log(a.y); // 1
  14. console.log(myClass.prototype.y); // 1

总结于MDN,链接

Object.defineProperty() - JavaScript | MDN

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号