ES6这里,想给所有的JS对象定义一个接口,那么对象是什么呢?①对象都有属性;②对象都有原型;③部分对象是构造函数/普通函数;
那么目前、未来所有的JS对象都有这3个特性的话,那么公共接口就从这3个方面进行入手。所以ECMAScript 标准委员会定义了一个由14种内部方法组成的集合,亦即一个适用于所有对象的通用接口。属性、原型和函数这三种基础功能自然成为它们关注的核心。
1.obj.[[Get]](key,receiver)获取属性值。
当JS代码执行以下方法时被调用:obj.prop或obj[key]。obj是当前被搜索的对象,receiver 是我们首先开始搜索这个属性的对象。
2.obj.[[Set]](key, value, receiver)为对象的属性赋值。
当JS代码执行以下方法时被调用: obj.prop=value或obj[key]=value。
3.obj.[HasProperty]检测对象中是否存在某属性。
当JS代码执行以下方法时被调用:key in obj。
4.obj.[Enumerate]列举对象的可枚举属性。
当JS代码执行以下方法时被调用:for (key in obj)这个内部方法会返回一个可迭代对象,for-in循环可通过这个方法得到对象属性的名称。
5.obj.[GetPrototypeOf]返回对象的原型。
当JS代码执行以下方法时被调用:obj.[__proto__]或Object.getPrototypeOf(obj)。
6.functionObj.[[Call]](thisValue, arguments)调用一个函数。
当JS代码执行以下方法时被调用:functionObj()或x.method()。参数可选的,不是每一个对象都是函数。
7.constructorObj.[[Construct]](arguments, newTarget)调用一个构造函数。
当JS 代码执行以下方法时被调用:new Date(2890, 6, 2)。参数是可选的,不是每一个对象都是构造函数。
var proxy = new Proxy(target, handler);
proxy的行为很简单:将代理的所有内部方法转发至目标,即调用者通过直接调用proxy的方法,来间接调用target方法。
handler对象的方法可以覆写任意代理的内部方法,即如果handler不为空的话,那么调用者直接调用proxy方法,最后还是执行handler覆写后的方法,至于没有覆写的方法最后还是让target来执行。