You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functionAnimal(){returncreateValidator(this,animalValidator);}varanimalValidator={name: function(name){// 动物的名字必须是字符串类型的returntypeofname==='string';}};functioncreateValidator(target,validator){returnnewProxy(target,{set: function(target,key,value){if(validator[key]){// 符合验证条件if(validator[key](value)){target[key]=value;}else{throwError(`Cannot set ${key} to ${value}. Invalid.`);}}else{target[key]=value}}});}vardog=newAnimal();dog.name='dog';console.log(dog.name);dog.name=123;// Uncaught Error: Cannot set name to 123. Invalid.
functionGreeting(name){this.name=name;}// new 的写法constinstance=newGreeting('张三');// Reflect.construct 的写法constinstance=Reflect.construct(Greeting,['张三']);
Proxy
基本概念
Proxy(代理) 是 ES6 中新增的一个特性。Proxy 让我们能够以简洁易懂的方式控制外部对对象的访问。其功能非常类似于设计模式中的代理模式。
使用 Proxy 的好处是:对象只需关注于核心逻辑,一些非核心的逻辑 (如:读取或设置对象的某些属性前记录日志;设置对象的某些属性值前,需要验证;某些属性的访问控制等)可以让 Proxy 来做。 从而达到关注点分离,降级对象复杂度的目的。
api 有哪些?
var p = new Proxy(target, handler);
其中,target 为被代理对象。handler 是一个对象,其声明了代理 target 的一些操作。p 是代理后的对象。当外界每次对 p 进行操作时,就会执行 handler 对象上的一些方法。
handler 能代理的一些常用的方法如下:
handler.getPrototypeOf(): Object.getPrototypeOf 方法的捕捉器。
handler.setPrototypeOf(): Object.setPrototypeOf 方法的捕捉器。
handler.isExtensible(): Object.isExtensible 方法的捕捉器。
handler.preventExtensions(): Object.preventExtensions 方法的捕捉器。
handler.getOwnPropertyDescriptor(): Object.getOwnPropertyDescriptor 方法的捕捉器。
handler.defineProperty(): Object.defineProperty 方法的捕捉器。
handler.has(): in 操作符的捕捉器。
handler.get(): 属性读取操作的捕捉器。
handler.set(): 属性设置操作的捕捉器。
handler.deleteProperty(): delete 操作符的捕捉器。
handler.ownKeys(): Object.getOwnPropertyNames 方法和 Object.getOwnPropertySymbols 方法的捕捉器。
handler.apply(): 函数调用操作的捕捉器。
handler.construct(): new 操作符的捕捉器。
...
基础使用
使用示例 - 实现虚拟属性
使用示例 - 实现私有变量
下面的 demo 实现了真正的私有变量。代理中把以 _ 开头的变量都认为是私有的。
使用示例 - 抽离校验模块
Reflect
概念
Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与
proxy handler
的方法相同。Reflect 不是一个函数对象,因此它是不可构造的。与大多数全局对象不同 Reflect 并非一个构造函数,所以不能通过 new 运算符对其进行调用,或者将 Reflect 对象作为一个函数来调用。Reflect 的所有属性和方法都是静态的(就像 Math 对象)。
api 有哪些?
Reflect.apply(target, thisArgument, argumentsList): 对一个函数进行调用操作,同时可以传入一个数组作为调用参数。和 Function.prototype.apply() 功能类似。
Reflect.construct(target, argumentsList[, newTarget]): 对构造函数进行 new 操作,相当于执行 new target(...args)。
Reflect.defineProperty(target, propertyKey, attributes): 和 Object.defineProperty() 类似。如果设置成功就会返回 true
Reflect.deleteProperty(target, propertyKey): 作为函数的delete操作符,相当于执行 delete target[name]。该方法返回一个布尔值。
该方法返回一个布尔值。如果删除成功或删除的属性不存在,则返回true,如果删除失败,删除的属性依然还在,则返回false。
Reflect.get(target, propertyKey[, receiver]): 获取对象身上某个属性的值,类似于 target[name]。
Reflect.getOwnPropertyDescriptor(target, propertyKey): 类似于 Object.getOwnPropertyDescriptor()。如果对象中存在该属性,则返回对应的属性描述符,否则返回 undefined。
Reflect.getPrototypeOf(target): 类似于 Object.getPrototypeOf()。
Reflect.has(target, propertyKey): 判断一个对象是否存在某个属性,和 in 运算符 的功能完全相同。
如果第一个参数不是对象,Reflect.has和in都会报错。
Reflect.isExtensible(target): 类似于 Object.isExtensible().
Reflect.ownKeys(target): 返回一个包含所有自身属性(不包含继承属性)的数组。(类似于 Object.keys(), 但不会受enumerable 影响).
Reflect.preventExtensions(target): 类似于 Object.preventExtensions()。返回一个Boolean。
Reflect.set(target, propertyKey, value[, receiver]): 将值分配给属性的函数。返回一个Boolean,如果更新成功,则返回true。
Reflect.setPrototypeOf(target, prototype): 设置对象原型的函数。返回一个 Boolean,如果更新成功,则返回 true。
The text was updated successfully, but these errors were encountered: