JavaScript の Reflect 組み込みオブジェクトの簡単な分析 (詳細なコードの説明)

奋力向前
リリース: 2021-08-25 18:48:30
転載
2447 人が閲覧しました

前回の記事「この記事ではVueでルーティング切り替えによる非同期リクエストを終了する方法を解説します(コード付き)」で、Vueでルーティング切り替えによる非同期リクエストを終了する方法を紹介しました。 。 js の Reflect 組み込みオブジェクトを理解するには、次の記事が役立ちます。一定の参考価値があります。必要な友人は参照できます。お役に立てば幸いです。

JavaScript の Reflect 組み込みオブジェクトの簡単な分析 (詳細なコードの説明)

セマンティクス

Reflect は、JavaScript 操作のインターセプトを提供する組み込みオブジェクトです。方法。これらのメソッドはプロセッサ オブジェクトのメソッドと同じです。 Reflect は関数オブジェクトではないため、構築できません。

説明

ほとんどのグローバル オブジェクトとは異なり、Reflect にはコンストラクターがありません。 new 演算子と一緒に使用したり、関数として Reflect オブジェクトを呼び出したりすることはできません。 Reflect のすべてのプロパティとメソッドは静的です (Math オブジェクトと同様)。

互換性

Chrome: 49

Firefox (Gecko): 42

他のブラウザはまだ実装されていません

構文

Reflect.apply(target, thisArgument, argumentList)

Parameters

target

ターゲット関数。

この議論 target

関数が呼び出されたときにバインドされる this オブジェクト。

argumentsList

ターゲット関数の呼び出し時に渡される実際のパラメータのリスト。このパラメータは配列のようなオブジェクトである必要があります。

メソッド

Reflect.apply()

Reflect.construct(target, argumentList[, 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 演算子コンストラクターと少し似た動作をします。これは、以下と同等です。実行中新しいターゲット(...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 演算子 によく似ていますが、関数です。 Reflect.deletePropertyオブジェクトのプロパティを削除できます。属性が正常に削除されたかどうかを示すブール値を返します。これは、非厳密な削除演算子とほぼ同じです。

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(ターゲット, propertyKey[, レシーバー])

// 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() メソッドに似ています。指定されたプロパティがオブジェクト内に存在する場合、そのプロパティ記述子を返します。それ以外の場合は、未定義が返されます。

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() メソッドと似ていますが、いくつかの違いがあります。詳細については、違いを参照してください。

Reflect.isExtensible(ターゲット)

// 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(ターゲット)

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 ()オブジェクトにプロパティを設定するのと同じように機能します。

Reflect.set(ターゲット, propertyKey, 値[, レシーバ])

// 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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
js
ソース:chuchur.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート