이전 글 "Vue에서 비동기 요청을 종료하기 위한 라우팅 전환을 설명하는 글(코드 포함)"에서 Vue에서 비동기 요청을 종료하기 위한 라우팅 전환에 대해 소개해드렸습니다. 다음 글은 js에 내장된 Reflect 객체를 이해하는 데 도움이 될 것입니다. 이는 특정 참조 가치가 있으므로 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
Reflect
是一个内置的对象,它提供拦截JavaScript
操作的方法。这些方法与处理器对象的方法相同。Reflect
不是一个函数对象,因此它是不可构造的。
与大多数全局对象不同,Reflect
没有构造函数。你不能将其与一个new
运算符一起使用,或者将Reflect
对象作为一个函数来调用。Reflect
的所有属性和方法都是静态的(就像 Math
对象)。
Chrome:49+
Firefox (Gecko):42+
其他浏览器暂未实现
Reflect.apply(target, thisArgument, argumentsList)
target
Reflect
JavaScript
작업을 가로채는 메서드를 제공하는 내장 개체입니다. 이러한 메소드는 프로세서 객체의 메소드와 동일합니다.Reflect는 함수 객체가 아니므로 구성할 수 없습니다.
this
对象。
argumentsList
target函数调用时传入的实参列表,该参数应该是一个类数组的对象。
Reflect.apply()
Reflect.construct(target, argumentsList[, newTarget])
静态方法Reflect.apply()
通过指定的参数列表发起对目标(target
)函数的调用。
Reflect.apply(Math.floor, undefined, [1.75]); // 1; Reflect.apply(String.fromCharCode, undefined, [104, 101, 108, 108, 111]); // "hello" Reflect.apply(RegExp.prototype.exec, /ab/, ["confabulation"]).index; // 4 Reflect.apply("".charAt, "ponies", [3]); // "i"
Reflect.construct()
Reflect.construct()
方法的行为有点像new操作符 构造函数 , 相当于运行new target(...args)
。
var d = Reflect.construct(Date, [1776, 6, 4]); d instanceof Date; // true d.getFullYear(); // 1776
Reflect.defineProperty()
Reflect.defineProperty()
是一个静态的方法,看起来像Object.defineProperty()
但是它返回一个布尔值
const object1 = {}; if (Reflect.defineProperty(object1, "property1", { value: 42 })) { console.log("property1 created!"); // expected output: "property1 created!" } else { console.log("problem creating property1"); } console.log(object1.property1); // expected output: 42
Reflect.deleteProperty()
静态方法Reflect.deleteProperty()
允许用于删除属性。它很像delete operator
,但它是一个函数。Reflect.deleteProperty
允许你删除一个对象上的属性。返回一个Boolean值表示该属性是否被成功删除。它几乎与非严格的delete operator相同。
Reflect.deleteProperty(target, propertyKey)
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()
Reflect.get()
方法的工作方式,就像从object (target[propertyKey])
中获取属性,但它是作为一个函数执行的。
Reflect.get(target, propertyKey[, receiver])
// Object var obj = { x: 1, y: 2 }; Reflect.get(obj, "x"); // 1 // Array Reflect.get(["zero", "one"], 1); // "one" // Proxy with a get handler var x = { p: 1 }; var obj = new Proxy(x, { get(t, k, r) { return k + "bar"; }, }); Reflect.get(obj, "foo"); // "foobar"
Reflect.getOwnPropertyDescriptor()
静态方法Reflect.getOwnPropertyDescriptor()与Object.getOwnPropertyDescriptor()
方法相似。如果在对象中存在,则返回给定的属性的属性描述符。否则返回 undefined。
Reflect.getOwnPropertyDescriptor(target, propertyKey)
Reflect.getOwnPropertyDescriptor({ x: "hello" }, "x"); // {value: "hello", writable: true, enumerable: true, configurable: true} Reflect.getOwnPropertyDescriptor({ x: "hello" }, "y"); // undefined Reflect.getOwnPropertyDescriptor([], "length"); // {value: 0, writable: true, enumerable: false, configurable: false}
Reflect.getPrototypeOf()
静态方法Reflect.getPrototypeOf()与Object.getPrototypeOf()
方法是一样的。都是返回指定对象的原型(即,内部的 [[Prototype]]
属性的值)。
Reflect.getPrototypeOf(target)
Reflect.getPrototypeOf({}); // Object.prototype Reflect.getPrototypeOf(Object.prototype); // null Reflect.getPrototypeOf(Object.create(null)); // null
Reflect.has()
静态方法Reflect.has()
作用与in
操作符相同。
Reflect.has(target, propertyKey)
Reflect.has({ x: 0 }, "x"); // true Reflect.has({ x: 0 }, "y"); // false // 如果该属性存在于原型链中,返回true Reflect.has({ x: 0 }, "toString"); // Proxy 对象的 .has() 句柄方法 obj = new Proxy( {}, { has(t, k) { return k.startsWith("door"); }, } ); Reflect.has(obj, "doorbell"); // true Reflect.has(obj, "dormitory"); // false
Reflect.isExtensible()
静态方法Reflect.isExtensible()
判断一个对象是否可扩展 (即是否能够添加新的属性)。与它Object.isExtensible()
方法相似,但有一些不同,详情可见differences
。
Reflect.isExtensible(target)
// New objects are extensible. var empty = {}; Reflect.isExtensible(empty); // === true // ...but that can be changed. Reflect.preventExtensions(empty); Reflect.isExtensible(empty); // === false // Sealed objects are by definition non-extensible. var sealed = Object.seal({}); Reflect.isExtensible(sealed); // === false // Frozen objects are also by definition non-extensible. var frozen = Object.freeze({}); Reflect.isExtensible(frozen); // === false //diff Object.isExtensible Reflect.isExtensible(1); // TypeError: 1 is not an object Object.isExtensible(1); // false
Reflect.ownKeys()
静态方法Reflect.ownKeys()
返回一个由目标对象自身的属性键组成的数组。
Reflect.ownKeys(target)
const object1 = { property1: 42, property2: 13, }; var array1 = []; console.log(Reflect.ownKeys(object1)); // expected output: Array ["property1", "property2"] console.log(Reflect.ownKeys(array1)); // expected output: Array ["length"] Reflect.ownKeys({ z: 3, y: 2, x: 1 }); // [ "z", "y", "x" ] Reflect.ownKeys([]); // ["length"] var sym = Symbol.for("comet"); var sym2 = Symbol.for("meteor"); var obj = { [sym]: 0, str: 0, "773": 0, "0": 0, [sym2]: 0, "-1": 0, "8": 0, "second str": 0, }; Reflect.ownKeys(obj); // [ "0", "8", "773", "str", "-1", "second str", Symbol(comet), Symbol(meteor) ] // Indexes in numeric order, // strings in insertion order, // symbols in insertion order
Reflect.preventExtensions()
静态方法Reflect.preventExtensions()
方法阻止新属性添加到对象例如:防止将来对对象的扩展被添加到对象中)。该方法与Object.preventExtensions()
相似,但有一些不同点。
Reflect.preventExtensions(target)
// Objects are extensible by default. var empty = {}; Reflect.isExtensible(empty); // === true // ...but that can be changed. Reflect.preventExtensions(empty); Reflect.isExtensible(empty); // === false //diff Object.preventExtensions() Reflect.preventExtensions(1); // TypeError: 1 is not an object Object.preventExtensions(1); // 1
Reflect.set()
静态方法Reflect.set()
대부분의 전역 개체와 달리
에는 생성자가 없습니다.new
연산자와 함께 사용하거나 🎜Reflect🎜 개체를 함수로 호출할 수 없습니다. 🎜Reflect🎜의 모든 속성과 메서드는 정적입니다(🎜Math🎜 개체와 마찬가지로). 🎜🎜호환성🎜🎜Chrome: 49+🎜🎜Firefox(Gecko): 42+🎜🎜다른 브라우저는 아직 구현되지 않았습니다.🎜🎜Syntax🎜🎜🎜Reflect.apply(target, thisArgument,argList)🎜🎜🎜Parameters🎜 🎜🎜 대상 🎜🎜🎜타겟 기능. 🎜🎜🎜이 인수 target🎜🎜🎜 함수가 호출될 때 바인딩된 🎜this🎜 개체입니다. 🎜🎜🎜argumentsList🎜🎜🎜대상 함수 호출 시 전달되는 실제 매개변수 목록입니다. 이 매개변수는 배열형 객체여야 합니다. 🎜🎜메서드 🎜🎜Reflect.apply()🎜🎜🎜Reflect.construct(target, 인수List[, newTarget])🎜🎜🎜정적 메서드 🎜Reflect.apply()🎜지정된 매개변수 목록으로 시작 대상(🎜target🎜) 함수에 대한 호출입니다. 🎜// Object var obj = {}; Reflect.set(obj, "prop", "value"); // true obj.prop; // "value" // Array var arr = ["duck", "duck", "duck"]; Reflect.set(arr, 2, "goose"); // true arr[2]; // "goose" // It can truncate an array. Reflect.set(arr, "length", 1); // true arr; // ["duck"]; // With just one argument, propertyKey and value are "undefined". var obj = {}; Reflect.set(obj); // true Reflect.getOwnPropertyDescriptor(obj, "undefined"); // { value: undefined, writable: true, enumerable: true, configurable: true }🎜Reflect.construct()🎜🎜🎜Reflect.construct()🎜 메서드는 new 연산자 생성자와 약간 유사하게 동작하며, 이는 🎜new target(...args)🎜을 실행하는 것과 동일합니다. . 🎜Reflect.setPrototypeOf({}, Object.prototype); // true // It can change an object's [[Prototype]] to null. Reflect.setPrototypeOf({}, null); // true // Returns false if target is not extensible. Reflect.setPrototypeOf(Object.freeze({}), null); // false // Returns false if it cause a prototype chain cycle. var target = {}; var proto = Object.create(target); Reflect.setPrototypeOf(target, proto); // false🎜Reflect.defineProperty()🎜🎜🎜Reflect.defineProperty()🎜는 🎜Object.defineProperty()🎜와 유사하지만 부울 값 🎜rrreee🎜을 반환하는 정적 메서드입니다. Reflect.deleteProperty()🎜🎜정적 메서드 🎜Reflect.deleteProperty()🎜를 사용하면 속성을 삭제할 수 있습니다. 🎜delete 연산자🎜와 많이 비슷하지만 함수입니다. 🎜Reflect.deleteProperty🎜를 사용하면 객체의 속성을 삭제할 수 있습니다. 속성이 성공적으로 삭제되었는지 여부를 나타내는 부울 값을 반환합니다. 이는 엄격하지 않은 삭제 연산자와 거의 동일합니다. 🎜🎜🎜Reflect.deleteProperty(target, propertyKey)🎜🎜rrreee🎜Reflect.get()🎜🎜🎜Reflect.get()🎜 메소드는 🎜object (target[propertyKey ])🎜에서처럼 작동합니다. 하지만 함수로 실행됩니다. 🎜🎜🎜Reflect.get(target, propertyKey[, receive])🎜🎜rrreee🎜Reflect.getOwnPropertyDescriptor()🎜🎜정적 메서드 🎜Reflect.getOwnPropertyDescriptor()는 Object.getOwnPropertyDescriptor()와 유사합니다🎜 . 개체에 있는 경우 해당 속성의 속성 설명자를 반환합니다. 그렇지 않으면 정의되지 않은 값이 반환됩니다. 🎜🎜🎜Reflect.getOwnPropertyDescriptor(target, propertyKey)🎜🎜rrreee🎜Reflect.getPrototypeOf()🎜🎜Static method🎜Reflect.getPrototypeOf()는 Object.getPrototypeOf()🎜method와 동일합니다. 둘 다 지정된 객체의 프로토타입(즉, 내부 🎜[[Prototype]] 🎜 속성의 값)을 반환합니다. 🎜🎜🎜Reflect.getPrototypeOf(target)🎜🎜rrreee🎜Reflect.has()🎜🎜정적 메서드 🎜Reflect.has()🎜는 🎜in🎜 연산자와 동일한 효과를 갖습니다. 🎜🎜🎜Reflect.has(target, propertyKey)🎜🎜rrreee🎜Reflect.isExtensible()🎜🎜정적 메서드 🎜Reflect.isExtensible()🎜객체가 확장 가능한지 확인(즉, 추가할 수 있는지 여부) 새로운 속성). 🎜Object.isExtensible()🎜 메서드와 비슷하지만 몇 가지 차이점이 있습니다. 자세한 내용은 🎜차이점🎜을 참조하세요. 🎜🎜Reflect.isExtensible(target)🎜rrreee🎜Reflect.ownKeys()🎜🎜정적 메서드 🎜Reflect.ownKeys()🎜대상 개체 자체의 속성 키를 반환합니다. 배열로 구성됩니다. 🎜🎜🎜Reflect.ownKeys(target)🎜🎜rrreee🎜Reflect.preventExtensions()🎜🎜정적 메서드 🎜Reflect.preventExtensions()🎜method는 새 속성이 객체에 추가되는 것을 방지합니다. 객체에 대한 향후 수정을 방지합니다. 이 메서드는 🎜Object.preventExtensions()🎜와 유사하지만 몇 가지 차이점이 있습니다. 🎜🎜🎜Reflect.preventExtensions(target)🎜🎜rrreee🎜Reflect.set()🎜🎜정적 메서드 🎜Reflect.set()🎜은 객체에 속성을 설정하는 것처럼 작동합니다. 🎜🎜🎜Reflect.set(target, propertyKey, value[, receive])🎜
// Object var obj = {}; Reflect.set(obj, "prop", "value"); // true obj.prop; // "value" // Array var arr = ["duck", "duck", "duck"]; Reflect.set(arr, 2, "goose"); // true arr[2]; // "goose" // It can truncate an array. Reflect.set(arr, "length", 1); // true arr; // ["duck"]; // With just one argument, propertyKey and value are "undefined". var obj = {}; Reflect.set(obj); // true Reflect.getOwnPropertyDescriptor(obj, "undefined"); // { value: undefined, writable: true, enumerable: true, configurable: true }
Reflect.setPrototypeOf()
静态方法Reflect.setPrototypeOf()与Object.setPrototypeOf()
方法是一致的。它将指定对象的原型 (即,内部的[[Prototype]]
属性)设置为另一个对象或为null
。
Reflect.setPrototypeOf(target, prototype)
Reflect.setPrototypeOf({}, Object.prototype); // true // It can change an object's [[Prototype]] to null. Reflect.setPrototypeOf({}, null); // true // Returns false if target is not extensible. Reflect.setPrototypeOf(Object.freeze({}), null); // false // Returns false if it cause a prototype chain cycle. var target = {}; var proto = Object.create(target); Reflect.setPrototypeOf(target, proto); // false
推荐学习:JavaScript视频教程
위 내용은 JavaScript의 Reflect 내장 객체에 대한 간략한 분석(자세한 코드 설명)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!