object.defineProperty函数详解

函数简介

vue2实现响应式的原理其中一步就是使用Object.denfineProperty来把data声明的每个属性使用数据描述符定义。具体vue实现原理:vue实现原理

函数用法

Object.denfineProperty(object,‘propertyName’,options);
函数主要接受三个参数:
object: 你需要新增或修改的对象。
propertyName:你需要新增或修改的属性名称。
options:属性的一些描述符,主要有configurable、enumerable、value、writable、get、set这几个属性。下面我们详细讲解每个属性的作用。

*需要注意的是: 在设置option时configurable、enumerable、value、writable数据描述类型可以一起配置,configurable、enumerable、get、set读取描述类型可以一起配置。 但是value或writable与get或set在一起就会抛出异常。

属性描述符详解

writable: 默认值为false,只有当值为true时,才可以进行重新赋值的操作。

 // 严格模式下
 var o = {};
    Object.defineProperty(o, "a", {
      configurable: false,
      value: 12,
      writable: false,
    });
    console.log(o.a); // 12
    o.a = 31; // 抛出异常Uncaught TypeError: Cannot assign to read only property 'a' of object '#'
    console.log(o.a);```
// 如果是非严格模式下并不会抛出异常,只不过o.a = 31,重新赋值的操作没有生效,最后打印出来的还是12
 
  

value:默认值为undefined,设置属性的值。没什么好说的。 writable和value都属于数据描述符。

configurable:如果属性已经存在,Object.defineProperty()将尝试根据描述符中的值以及对象当前的配置来修改这个属性。如果旧描述符将其configurable 属性设置为false,则该属性被认为是“不可配置的”,并且没有属性可以被改变(除了单向改变 writable 为 false)。当属性不可配置时,不能在数据和访问器属性类型之间切换。

var o = {};
// 读取描述类型 初始定义为不可配置的
Object.defineProperty(o, 'a', {
  get() { return 1; },
  configurable: false
});
// 修改配置会抛出异常
Object.defineProperty(o, 'a', {
  configurable: true
}); // throws a TypeError
Object.defineProperty(o, 'a', {
  enumerable: true
}); // throws a TypeError
Object.defineProperty(o, 'a', {
  set() {}
}); // throws a TypeError (set was undefined previously)
Object.defineProperty(o, 'a', {
  get() { return 1; }
}); // throws a TypeError
// (even though the new get does exactly the same thing)
// 修改为数据描述类型也会抛出异常
Object.defineProperty(o, 'a', {
  value: 12
}); // throws a TypeError // ('value' can be changed when 'configurable' is false but not in this case due to 'get' accessor)

console.log(o.a); // logs 1
delete o.a; // Nothing happens
console.log(o.a); // logs 1

enumerable: 当且仅当该属性为true时,该属性才会出现在对象的枚举属性中。默认为false 被for…in Object.keys遍历

// 存取描述类型
get: () => {}, // 如果没有设置get,默认的返回值为undefined,当访问该属性时会调用此函数
set: () => {}, // 如果没有设置set函数。返回值默认为undefined, 当设置该属性时会调用此函数

你可能感兴趣的:(js,前端,javascript,前端,vue.js)