تعكس مقدمة:
لم يتم تنفيذ كائن الانعكاس في العقدة الخاصة بي (v4.4.3) ، ولم يتم تنفيذ Babel (6.7.7). يتم دعم الإصدار الجديد من Chrome. لقد دعمت FF الوكيل وتعكس لفترة طويلة. إذا كنت تريد أن تدعم العقدة ، فيمكنك تثبيت Harmony-Replect ؛
الانعكاس ليس مُنشئًا. عند استخدامه ، يسمى مباشرة من خلال الانعكاس. method (). تشبه بعض طرق الانعكاس الوكيل ، ومعظم الأساليب التي تم إعادة تنفيذ الكائنات الأصلية.
ما يجب استخدامه يعكس
فيما يلي بعض الأسباب التي تجعل الانعكاس يستخدم. عنوان الترجمة: انعكاس ، مترجم تقريبًا:
1: قيمة الإرجاع الأكثر فائدة: تعكس بعض الطرق مثل طريقة الكائن في ES5 ، مثل: resperence.getownPropertyDescriptor و Respervin.DefineProperty. ومع ذلك ، إذا تم تنفيذ الكائن. سوف تعكس. defineProperty فقط سوف يعيد خطأ أو حقيقي للإشارة إلى ما إذا كانت خصائص الكائن قد تم تعيينها. يمكن إعادة تمثيل الرمز التالي:
جرب {object.defineProperty (obj ، name ، desc) ؛ // property محددة بنجاح} catch (e) {// failure fans (وقد تمسك بالاستثناء الخطأ)} عن طريق الخطأ)}أعيد بناؤه مثل هذا:
if (reflect.defineProperty (obj ، name ، desc)) {// success} آخر {// failure}الأساليب الأخرى ، مثل RESELECT.Set ، تعكس. deleteproperty ، تعكس.
2: تشغيل الوظيفة. إذا كنت ترغب في تحديد أن OBJ لديه اسم السمة محدد أو يرث ، فيمكنك الحكم عليه في ES5 مثل هذا: الاسم في OBJ ؛
أو حذف سمة: حذف OBJ [الاسم]. على الرغم من أنها مفيدة للغاية وقصيرة للغاية وواضحة ، إلا أنه يجب تغليفها أيضًا في فصل عندما يتم استخدامها ؛
مع الانعكاس ، فإنه يساعدك على تغليف ، reflect.has (obj ، name) ، reflect.deleteproperty (obj ، name) ؛
3: طريقة تنفيذ وظيفية أكثر موثوقية: في ES ، إذا كنت ترغب في تنفيذ وظيفة F وتمرير مجموعة من المعلمات Args إليها ، وربط هذا ، فأنت بحاجة إلى كتابة هذا:
F.Apply (OBJ ، args)
ومع ذلك ، قد يتم إعادة تعريف تطبيق F كتطبيق المستخدم الخاص ، لذلك يكون من الموثوقية أكثر موثوقية في الكتابة بهذه الطريقة:
function.prototype.apply.call (F ، OBJ ، args)
الكود أعلاه طويل جدًا ويصعب فهمه. مع الانعكاس ، يمكن أن نكون أقصر وأكثر وضوحا وأكثر وضوحا:
reflect.apply (F ، OBJ ، args)
4: المُنشئين في نموذج المعلمة المتنوعة: تخيل أنك تريد إنشاء إنشاء مُنشئ من خلال معلمات الطول غير المؤكد. في ES5 ، يمكننا استخدام رموز الامتداد ، والتي يمكن كتابتها مثل هذا:
var obj = new f (... args)
ومع ذلك ، في ES5 ، لا يتم دعم أحرف التمديد ، لذلك يمكننا فقط تمرير معلمات مختلفة في f.apply أو f.call. لسوء الحظ ، F هو مُنشئ ، وهو عملية احتيال ، ولكن مع الانعكاس ،
يمكننا كتابة هذا في ES5:
var obj = respense.construct (f ، args)
5: يتحكم هذا في الملحق أو القارئ: في ES5 ، إذا كنت ترغب في قراءة سمات عنصر أو تعيين السمات على النحو التالي:
var name = ... // Get Get Name as a stringObj [name] // property keneric lookupobj [name] = value // perfect property
تتيح لنا updatereferflect.get و respense.set أن نفعل نفس الشيء ، ويضيف معلمة إضافية إلى Recciver ، مما يسمح لنا بتعيين Setter للكائن والاستعداد لأعلى ولأسفل هذا:
var name = ... // get name property as a stringReflect.get (obj ، name ، wrapper) // if obj [name] هو ملحق ، يتم تشغيله باستخدام `this === closper`reflect.set } ، bar: function () {Alert (1) ؛}} ؛ var wrapper = {bar: function () {console.log ("wrapper") ؛}} resparle.set (obj ، "foo" ، "value" ، wrapper) ؛6: تجنب الوصول المباشر إلى __proto__:
يوفر ES5 كائن
resparle.getPrototypeof (OBJ) و RESPRESSE.SETPROTOTYOF (OBJ ، NEWPROTO) ، هذه طريقة جديدة للوصول إلى النموذج الأولي للكائن وتعيينه:
تعكس. الاستخدام
reflect.apply هو في الواقع وظيفة. هناك حاجة إلى ثلاثة معلمات لتنفيذ الانعكاس.
المعلمة الأولى هي: الوظيفة التي سيتم تنفيذها ؛
المعلمة الثانية هي: السياق الذي يجب تنفيذه ؛
المعلمة الثالثة هي: هي صفيف أو صفيف زائفة ، والتي سيتم استخدامها كمعلمة لتنفيذ الوظيفة ؛
<script> دع fn = function () {this.attr = [0،1،2،3] ؛} ؛ دع obj = {} ؛ reflect.apply (fn ، obj ، []) console.log (obj) ؛ العرض التوضيحي لـ <script> respens.apply: <script> respervy.apply (Math.floor ، غير محدد ، [1.75]) ؛ // الإخراج: 1 ؛ reflect.apply (string.fromcharcode ، غير محدد ، [104 ، 101 ، 108 ، 108 ، 111]) ؛ // الإخراج: "Hello" resperence.apply (regexp.prototype.exec ،/ab/، ["confabulation"]). الفهرس ؛ // الإخراج: 4reflect.apply ("". charat ، "المهور" ، [3]) ؛ // الإخراج: "i" </script> يمكن استخدام الانعكاس في تركيبة مع proxy: {var fn = function () {} ؛ fn.prototype.run = function () {console.log ("rots out") ؛ Target (... acurgments) ؛ // كيفية استخدام الانعكاس. // الإخراج أولاً: "منشئ الوكيل" ؛ ثم الإخراج: ينفد} reflect.construct (): resperence.construct هو في الواقع مُنشئ مثيل. يتم تنفيذه من خلال نموذج الحجة. طريقة التنفيذ مختلفة. التأثير هو نفسه في الواقع. المعلمة الأولى للبناء هي المُنشئ ، والمعلمة الثانية هي صفيف أو طيور زائفة تتكون من معلمات. طريقة الاستخدام الأساسية هي: var fn = function (arg) {this.args = [arg]} ؛ console.log (new fn (1) ، reflect.construct (fn ، [1])) ؛ . // trued.getlyear () ؛ // 1776 // SO REFFICE.CONTRUCT و CONTRUCT NEW SLESS.CONTRUCT والبناء الجديد هما متماثلان ، على الأقل حتى الآن ... يمكننا تمرير المعلمة الثالثة للانعكاس ، والمعلمة الثالثة هي طبقة فائقة. سوف يرث العنصر الجديد هذا الفئة الفائقة. <script> function someconstructor () {} var result = resparle.construct (Array ، [] ، someconstructor) ؛ resparle.getPrototypeof (result) ؛ // someconstructor.prototypearray.isarray (النتيجة) ؛ // true // orvar fn = function () {this.attr = [1] ؛} ؛ var person = function () {} ؛ person.prototype.run = function () {} ؛ console.log (reflect.construct (fn ، [] ، person)) ؛ </script> حتى نتمكن من استخدام مركبة خاصة ، وثيقة ، ولكننا نرسلها أيضًا ؛ var fn = function () {array.apply (هذا ، الوسائط) ؛ this.shot = () => {console.log ("heheda") ؛} ؛} ؛ var arr = resperence.construct (fn ، []) resparle.defineProperty ؛ RESRESS.DEFINEPROPERTY إرجاع قيمة منطقية ، وتتم إضافة قيمة السمة إلى الكائن عن طريق التعيين المباشر. إرجاع كائن كامل ، في حالة فشل الإضافة ، سيتم طرح خطأ ؛ var obj = {} ؛ obj.x = 10 ؛ console.log (obj.x) // الإخراج: 10 ؛ إضافة قيمة باستخدام Reflect.DefineProperty ؛ <script> var obj = {} ؛ if (reflese.defineProperty (obj ، "x" ، {value: 7})) {console.log ("النجاح المضافة") ؛} else {console.log ("الإضافة النجاح") ؛ resperence.defineProperty ، ويتم إرجاع القيمة الخاطئة: var obj = {} ؛ object.preventStextensions (obj) ؛ object.defineProperty (obj ، "x" ، {value: 101 ، consable: false ، enumeries: false ، config: false}) ؛ console.log (resperence.defineProperty (OBJ ، "X" ، {value: 101})) // FALSE: إذا تم تعيين القيمة مباشرة ، فسيتم إرجاع القيمة المحددة بغض النظر عما إذا تم تعيين القيمة بشكل صحيح ، إلا إذا تأكدنا يدويًا ما إذا كانت قيمة خاصية الكائن قد تم تعيينها بنجاح ؛ <script> var obj = {} ؛ object.preventextensions (obj) ؛ console.log (obj.aa = 1) ؛ // الإخراج: 1 ؛ console.log (obj.aa) // الإخراج: غير محدد ؛ </script> respervent.deleteproperty استخدام: resperence.deleteproperty و respens.defineProperty Use متشابهة. نتائج تشغيل الانعكاس. الفرق هو أن نماذج الاستخدام مختلفة: أحدها مشغل والآخر هو استدعاء وظيفة ؛ resparle.deleteproperty (object.freeze ({foo: 1}) ، "foo") ؛ // falsedelete object.freeze ({foo: 1}). foo ؛ // الإخراج: خطأ ؛ هناك معلمتان ضروريتان لاستخدام طريقة resperence.get (): الأول هو كائن هدف OBJ ، والثاني هو كائن اسم السمة ، والثالث اختياري ، وهو سياق القارئ (هذا) ؛ var obj = {} ؛ obj.foo = 1 ؛ console.log (obj.foo) ؛ // الإخراج: 1 ؛ console.log (reflect.get (obj ، "foo")) // الإخراج: 1 ؛ إذا كان لدى العكس. var obj = {"foo": 1 ، get bar () {return this.foo ؛}} ؛ var foo = {} ؛ foo.foo = "heheda" ؛ console.log (strense.get (obj ، "bar" ، foo)) ؛ respare.getownpropertydescriptor () method: get the property. resparle.getownProperTyDescriptor ({x: "hello"} ، "x") ؛ // يمكنك أيضًا الحصول عليها على هذا النحو: object.getownpropertyDescriptor ({x: "1"} ، "x") ؛ // رمي كائن استثناء. // الإخراج: {value: "h" ، قابلة للكتابة: خطأ ، تعداد: صحيح ، قابل للتكوين: false} resparle.getPrototypeof () استخدام الطريقة: resperting.getPrototypeof و Object.getPrototypeof هي نفسها ، وكلاهما يرجع النموذج الأولي لـ consust.getPrototypeofeof ({}) ؛ // الإخراج: object.prototypereflect.getPrototypeof (Object.prototype) ؛ // الإخراج: nullreflect.getPrototypeof (object.create (null)) ؛ // الإخراج: nullreflect.has طريقة استخدام الانعكاس. تشبه إلى حد ما المشغل: في ، على سبيل المثال: xx في obj ؛ <script> resparle.has ({x: 0} ، "x") // الإخراج: true ؛ respense.has ({y: 0} ، "y") // الإخراج: صحيح ؛ var obj = {x: 0} ؛ console.log ("X" في OBJ) ؛ var proxy = new proxy (obj ، {has: function (target ، args) {console.log ("execute has method") ؛ return resparle.has (target ، ... args) ؛}}) ؛ console.log ("X" بالوكالة) ؛ // الإخراج: صحيح ؛ console.log (reflect.has (proxy ، "x")) // الإخراج: صحيح ؛ </script> OBJ لهذا العرض التوضيحي يعادل أن تصبح طريقة ، فهي عديمة الفائدة ، فهي تستخدم فقط طريقة لها: OBJ = New Proxy ({} ، {has (t ، k) {return k.startswith ("door") ؛}}) ؛ reflect.has (OBJ ، "Doorbell") ؛ // truereflect.has (OBJ ، "untramitary") ؛ // falsereflect.isextensable () use // الآن يمكن تمديد هذا العنصر ؛ var فارغ = {} ؛ reflect.isextensable (فارغ) ؛ // === true // استخدم طريقة PreventStextions لمنع هذا الكائن من توسيع سمات جديدة ؛ reflect.preventextensions (فارغة) ؛ عكس. // === false // لا يمكن لهذا الكائن تمديد سمات جديدة ، ولا يزال من الممكن تغيير السمات القابلة للكتابة var sealed = object.seal ({}) ؛ reflect.isextensible (مختومة) ؛ // === false // يتم تجميد هذا الكائن تمامًا var frozen = object.freeze ({}) ؛ resparle.isextensible (Frozen) ؛ // === خطأ الفرق بين الانعكاس. تعكس. console.log (reflect.ownkeys ({"a": 0 ، "b": 1 ، "c": 2 ، "d": 3})) ؛ // الإخراج: ["A" ، "B" ، "C" ، "D"] console.log (reflect.ownkeys ([])) ؛ // ["length"] var sym = symbor.for ("Comet") ؛ var sym2 = symbor.for ("meteor") ؛ var obj = {[sym]: 0 ، "str": 0 ، "773": 0 ، "0": 0 ، [Sym2]: 0 ، "-1": 0 ، "8": 0 ، // الإخراج: /["0" ، "8" ، "773" ، "str" ، "-1" ، "str" ، الرمز (المذنب) ، الرمز (meteor)]. أخيرًا ، يتم فرز مفاتيح نوع الرمز أيضًا وفقًا لترتيب الإدراج ؛ يحدث الفرز لأنه عندما تقوم بتعيين قيمة إلى سمة كائن ، فإن قاعدة الفرز لمفتاح الكائن هي الرقم الأول ، في سلسلة ، وأخيراً بيانات نوع الرمز ؛ طريقة الاستخدام لـ Reflect.PreventStextensions (): يحتوي الكائن أيضًا على طريقة PreventStensions ، والتي تختلف قليلاً عن الانعكاس. إذا كانت المعلمة reflect.preventextensions ليست كائنًا ، فسترمي خطأ ؛ var فارغ = {} ؛ reflect.isextensable (فارغ) ؛ // === true // يمكن تعديل الكائن بعد تنفيذ حالات الوقاية ؛ reflect.preventextensions (فارغة) ؛ عكس. // === falsereflect.preventextensions (1) ؛ // typeerror: 1 ليس كائنًا كائنًا. var obj = {} ؛ reflect.set (obj ، "prop" ، "value") ؛ // الإخراج: trueconsole.log (obj.prop) ؛ // الإخراج: "value" var arr = ["Duck" ، "Duck" ، "Duck"] ؛ Reflect.set (arr ، 2 ، "goose") ؛ // trueconsole.log (arr [2]) ؛ // "goose" resparle.set (arr ، "length" ، 1) ؛ // trueconsole.log (arr) ؛ // ["duck"] ؛ reflect.set (obj) مكافئ للانعكاس. // الإخراج: صواب // الرمز أعلاه يعادل الانعكاس. {console.log ("setter") ؛ this.value = value ؛} ، get key () {return this.value ؛}} ؛ reflect.set (obj ، "key" ، "heheda" ، obj) ؛ console.log (obj) ؛ sesperteProtprototypeof () response.setprototypeof () thanks tofice. سوف يعين نموذجًا أوليًا للكائن ، وهو تغيير سمة __proto__ للكائن ... ؛ robles.setPrototypeof ({} ، Object.prototype) ؛ // الإخراج true // إلى صفيف الكائن [[[النموذج الأولي]] هو null.reflect.setProtypeOfeof ({} ، null) ؛ // true // في هذا الوقت ، obj .__ proto__ غير محدد // مجانًا للكائن وإعادة ضبط [[[النموذج الأولي]] // false // إذا كانت سلسلة النموذج الأولي تعتمد على الحلقة ، فسيتم إرجاع false.var target = {} ؛ var proto = object.create (target) ؛ resparle.setPrototypeof (الهدف ، proto) ؛ // خطأ شنيع