方便理解 Vue 的 ES6 语法

Object.defineProperty()

给一个对象设置新的属性,或者修改属性。

兼容性:

IE9+,IE8中只能用在DOM对象上。

用法:

Object.defineProperty(obj, prop, descriptor)
const object1 = {};

 Object.defineProperty(object1, 'property1', {
   value: 42,
   writable: false
 });

 object1.property1 = 77;//严格模式下会报错
 
 console.log(object1.property1);
 // 42

proxy

为一个对象设置代理,这个代理为这个对象的方法设置拦截并进行处理。

兼容:

IE不支持

基础用法:

有两个参数,target 目标对象,handler 处理方法。

const proxy1 = new Proxy(target, handler);

重置目标对象的 get 方法

const target = {
  message1: "hello",
  message2: "everyone"
};

const handler3 = {
  get: function (target, prop, receiver) {
    if (prop === "message2") {
      return "world";
    }
    return Reflect.get(...arguments);
  },
};

const proxy3 = new Proxy(target, handler3);

console.log(proxy3.message1); // hello
console.log(proxy3.message2); // world

在 JavaScript 对象中可以完全复制所有属性,但对浏览器dom对象不起作用。

const target = {};
const p = new Proxy(target, {});

p.a = 37;

console.log(target.a);
//  37
// 目标对象被修改了

可以在 proxy 中进行验证

let validator = {
  set: function(obj, prop, value) {
    if (prop === 'age') {
      if (!Number.isInteger(value)) {
        throw new TypeError('The age is not an integer');
      }
      if (value > 200) {
        throw new RangeError('The age seems invalid');
      }
    }

    // 设置value值
    obj[prop] = value;

    // 返回成功
    return true;
  }
};

const person = new Proxy({}, validator);

person.age = 100;
console.log(person.age); // 100
person.age = 'young';    // Throws an exception
person.age = 300;        // Throws an exception

DOM操作

let view = new Proxy(
{
  selected: null  // target
},
{// handler
  set: function(obj, prop, newval) {
    let oldval = obj[prop];

    if (prop === 'selected') {
      if (oldval) {
        oldval.setAttribute('aria-selected', 'false');
      }
      if (newval) {
        newval.setAttribute('aria-selected', 'true');
      }
    }

    // 修改属性值
    obj[prop] = newval;

    // 返回成功
    return true;
  }
});

let i1 = view.selected = document.getElementById('item-1');  //i1 是 null
console.log(i1.getAttribute('aria-selected'));
//  'true'

let i2 = view.selected = document.getElementById('item-2');
console.log(i1.getAttribute('aria-selected'));
//  'false'
console.log(i2.getAttribute('aria-selected'));
//  'true'

Note: even if selected: !null, then giving oldval.setAttribute is not a function

Reflect

Reflect 是内置的,不可修改,提供了拦截javascript操作的方法。Reflect的所有属性和方法都是静态的。其中的一些方法与 Object 的方法相同。

和 Proxy 配合使用,例如访问对象的 set、deleteProperty 等方法,返回true/false;get 方法,返回属性的值。

WeakMap

WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。

Object.create()

创建一个新对象。

浏览器支持:

IE9

用法:

Object.create(proto, [propertiesObject])
const person = {
   isHuman: false,
   printIntroduction: function() {
     console.log(My name is ${this.name}. Am I human? ${this.isHuman});
   }
 };

 const me = Object.create(person);
 me.name = 'Matthew'; // 修改了"me"的"name",没有修改 "person"的
 me.isHuman = true; // 继承属性可以被重写

 me.printIntroduction();
 // "My name is Matthew. Am I human? true"

Object.getOwnPropertyDescriptor()

返回一个对象,描述目标对象的一个属性。

兼容性:

IE9+,IE8中只能用在DOM对象上。

用法:

Object.getOwnPropertyDescriptor(obj, prop)
const object1 = {
   property1: 42
 };
 const descriptor1 = Object.getOwnPropertyDescriptor(object1, 'property1');
 console.log(descriptor1.configurable);
 // true
 console.log(descriptor1.value);
 // 42

相关链接:

https://www.huangyuhong.cn/2018/11/function-%e6%9e%84%e9%80%a0%e5%87%bd%e6%95%b0/
https://www.huangyuhong.cn/2018/11/js%e5%9f%ba%e7%a1%80-array/
https://www.huangyuhong.cn/2017/09/es6-array%e3%80%81iterator%e6%8e%a5%e5%8f%a3%e4%bb%a5%e5%8f%8a%e9%81%8d%e5%8e%86%e8%af%ad%e6%b3%95%e7%9a%84%e6%af%94%e8%be%83/

参考:

比较 Reflect 和 Object 方法

Reflect

Object