Object.defineProperty 使用方法 数据劫持

Object.defineProperty

定义属性
需要三个参数
obj 要定义属性的那个对象
prop 要定义的属性名
descriptor 描述项集合 配置集合
案例

function defineProperty() {
  var _obj = {};
  Object.defineProperty(_obj, 'a', {
    value: 1,
  });
  return _obj;
}
var obj = defineProperty();
console.log(obj);

defineProperties一次定义多个属性

function defineProperty() {
  var _obj = {};
  Object.defineProperties(_obj, {
    a: {
      value: 1,
    },
    b: {
      value: 2,
    },
  });
  return _obj;
}
var obj = defineProperty();
console.log(obj);

在这里插入图片描述
定义的属性值 不可修改 不可枚举 不可删除

obj.a = 5;
console.log(obj);
for (var k in obj) {
  console.log(k + ': ' + obj[k]);
}
delete obj.a

在这里插入图片描述

writable

因为writable默认为false 不可写
改为true后

function defineProperty() {
  var _obj = {};
  Object.defineProperties(_obj, {
    a: {
      value: 1,
      writable: true,
    },
    b: {
      value: 2,
    },
  });
  return _obj;
}
var obj = defineProperty();
obj.a = 5;
obj.b = 6;
console.log(obj);

在这里插入图片描述

enumerable

enumerable 是否是可枚举的 默认为false
改为true后

function defineProperty() {
  var _obj = {};
  Object.defineProperties(_obj, {
    a: {
      value: 1,
      writable: true,
      enumerable: true,
    },
    b: {
      value: 2,
    },
  });
  return _obj;
}
var obj = defineProperty();
obj.a = 5;
obj.b = 6;
console.log(obj);
for (var key in obj) {
  console.log(key + ':' + obj[key]);
}

在这里插入图片描述

configurable

configurable 是否是可配置的 可操作的 默认为false
当设置为true后

function defineProperty() {
  var _obj = {};
  Object.defineProperties(_obj, {
    a: {
      value: 1,
      writable: true,
      enumerable: true,
      configurable: true,
    },
    b: {
      value: 2,
    },
  });
  return _obj;
}
var obj = defineProperty();
obj.a = 5;
obj.b = 6;
console.log(obj);
for (var key in obj) {
  console.log(key + ':' + obj[key]);
}
delete obj.a;

在这里插入图片描述

getter setter

每一个属性定义的时候 都会产生一个getter setter的机制

数据劫持

对待一个对象 取值也好设置值也好 有一系列的配置与阻止的方法 这就叫对一组数据的劫持
阻拦正常的输出与输入 按照getter setter 执行操作逻辑

function defineProperty() {
  var _obj = {};
  var a = 1;
  Object.defineProperties(_obj, {
    a: {
      get() {
        return '"a"\'s value is ' + a + '.';
      },
      set(newValue) {
        console.log('The value "a" has been designed a new value ' + newValue + '.');
      },
    },
    b: {},
  });
  return _obj;
}

var obj = defineProperty();
console.log(obj.a);
obj.a = 2;

在这里插入图片描述
value 与 writable任意一个都不能与get set 同时出现
如果存在value 或 writable中的一个 还存在get set 会报错

function defineProperty() {
  var _obj = {};
  var a = 1;
  Object.defineProperties(_obj, {
    a: {
      // value: 1,
      writable: true,
      get() {
        return '"a"\'s value is ' + a + '.';
      },
      set(newValue) {
        console.log('The value "a" has been designed a new value ' + newValue + '.');
      },
    },
    b: {},
  });
  return _obj;
}

var obj = defineProperty();
console.log(obj.a);
obj.a = 2;  

在这里插入图片描述操作数组

function DataArr() {
  var _val = null,
    _arr = [];
  Object.defineProperty(this, 'val', {
    get: function () {
      return _val;
    },
    set: function (newValue) {
      _val = newValue;
      _arr.push({ val: _val });
      console.log('A new value "' + _val + '" has been pushed to _arr');
    },
  });
  this.getArr = function () {
    return _arr;
  };
}

var dataArr = new DataArr();
dataArr.val = 123;
dataArr.val = 234;
console.log(dataArr.getArr());

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_聪明勇敢有力气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值