Refelct
Reflect是一个内置的对象,他提供拦截的JavaScript的操作的方法。一共有 13 个静态的方法
Reflect的描述:
reflect与大多数的对象不同,Reflect并非一个构造函数,所以不能通过new运算符来对其进行引用,或者将Reflect对象作为一个函数来调用,Reflect的所有方法和属性都是静态的,相当于Math,Refelct相当一一个静态的类。
Reflect的静态的方法:
Relect.apply(target,thisargument,argumentsList) 通过指定的参数列表发起对目标(target)函数的调用。
target:目标函数
thisArgument tagert函数调用时绑定的this对象,也就是谁的方法
argument target函数调用时传入的参数
reflect.apply("".charAt,"liquan",[3]); // u
Reflect.construct(target, argumentsList[, newTarget]) 相当一替代new字符串
target相当一调用的目标构造函数
arguments 相当一传递构造函数的参数
第三个参数就是当做原型对象的函数,实现继承的效果
var obj = new Foo(...args);
var obj = Reflect.construct(Foo, args);
function Name (value) {
this.name = value;
}
function Perosn () {
}
Perosn.prototype.show = function () {
console.log("你好");
}
let person = Reflect.construct(Name,['李权'],Perosn); // 注意传递的参数是一个数组,如果不传递数组会报错
console.log(person.name);
console.log(person.show());
Reflect.defineProperty()
静态方法 Reflect.defineProperty()基本等同于 Object.defineProperty()方法,唯一不同的是返回Boolean值。
语法 : Reflect.defineProperty(target,propertyKey, attribute);
参数:
target: 目标对象
propertyKey: 要定义或修改的属性名
attribute; 要定义或修改的属性的描述 相当于静态属性的描述符 替换了Object.definProperty
返回值: 是一个boolean的值
异常: 如果 target不是一个对象会抛出typeError的错误
const obj = {};
let bool = Reflect.defineProperty(obj,'name',{value:7,writable:false});
console.log(bool);
console.log(obj.name);
obj.name = "李权";
console.log(obj.name); // 7
Reflect.deleteProperty() 允许用于删除属性
他像delete Obj.name 但是Reflect.deleteProperty它是一个函数
语法:Reflect.deleteProperty(target,PropertyKey);
参数: target 目标对象 propertyKey是需要删除属性的名字
返回值: 是一个布尔值判断是否删除成功
异常: 如果目标对象不是一个Object 会抛出一个TypeError
var obj = { x: 1, y: 2 };
Reflect.deleteProperty(obj, "x"); // true
obj; // { y: 2 }
var arr = [1, 2, 3, 4, 5];
Reflect.deleteProperty(arr, "3"); // true
arr; // [1, 2, 3, , 5]
// 如果属性不存在,返回 true
Reflect.deleteProperty({}, "foo"); // true
// 如果属性不可配置,返回 false
Reflect.deleteProperty(Object.freeze({foo: 1}), "foo"); // false
Reflect.get(target,property) 得到目标对象上的属性值,不同的是它是一个函数
异常: 如果target不是一个Object,会抛出一个typeError
Reflect.getOwnPropertyDescriptor()
Reflect.getOwnPropertyDescriptor()和Obejct.getOwnPropertyDecriptor方法相似,如果该对象存在,则返回给定属性的修饰符
Reflect.getPrototypeOf(target)
Reflect.getPrototypeOf() 和Object.getPrototypeOf() 是几乎一样的,返回目标对象的原型。
// 如果参数为 Object,返回结果相同
Object.getPrototypeOf({}) // Object.prototype
Reflect.getPrototypeOf({}) // Object.prototype
// 在 ES5 规范下,对于非 Object,抛异常
Object.getPrototypeOf('foo') // Throws TypeError
Reflect.getPrototypeOf('foo') // Throws TypeError
// 在 ES2015 规范下,Reflect 抛异常, Object 强制转换非 Object
Object.getPrototypeOf('foo') // String.prototype
Reflect.getPrototypeOf('foo') // Throws TypeError
// 如果想要模拟 Object 在 ES2015 规范下的表现,需要强制类型转换
Reflect.getPrototypeOf(Object('foo')) // String.prototype
Reflect.has(target,propertyKey)
Reflect.has() 和 in 操作符差不多
返回值 是一个布尔值,
异常: 如果传入的对象不是一个Object 会抛出一个异常。TypeError
Reflect.isExtensible(target) 判断对象是否可扩展,和Object.isExtensible()相似,但有一点差别
如果该方法的第一个参数不是一个对象(原始值),那么将造成一个 TypeError
异常。对于 Object.isExtensible()
,非对象的第一个参数会被强制转换为一个对象。
返回值:是一个布尔值
Reflect.ownKeys(target) 返回目标对象的自身属性构建的数组
异常: 如果不是一个Object会抛出一个异常。
Reflect.preventExtensions(target) 阻止目标对象扩展
返回值:是一个布尔值,
异常: 如果不是一个Object会抛出TypeError的错误的异常。
Relfect.set(target,propertyKey,value) 相当一在一个对象上设置属性,并添加值
Reflect.setPrototypeOf(target)给目标对象设置原型对象,返回值是一个boolean