Handlebars.js: التحكم في الوصول إلى الخصائص الأولية

تم إنشاؤها على ١١ يناير ٢٠٢٠  ·  3تعليقات  ·  مصدر: handlebars-lang/handlebars.js

بعد التعليقات من # 1633 و # 1634 والمشكلات المشار إليها ، أعتقد أنه سيكون من الجيد إنشاء خيار وقت تشغيل يسمح بإدراج النموذج الأولي لفئة معينة في القائمة البيضاء.

استدعاء نموذج الذكاء

template ({some: "input object"}, { allowedPrototypes: [
  Test
] })

سيسمح بتحليل خاصية ما إذا كان ما يلي صحيحًا.

parent[propertyName] === Test.prototype[propertyName] && Test.prototype.hasOwnProperty(propertyName)

أعتقد أنه سيكون مفيدًا عند استخدام فئات مخصصة في خوادم الويب ، لأنه بالتأكيد لن يتم حفظ لإيقاف عمليات فحص النماذج الأولية في مثل هذه البيئة.

أود أن يكون لدي آراء حول ذلك.

feature

التعليق الأكثر فائدة

تتمثل إحدى المشكلات المحتملة في أن المستخدمين يتوقعون أن إضافة B إلى النماذج الأولية المسموح بها سيعمل في هذه الحالة:

class A { get a() { return 'a' } }
class B extends A {}

const parent = new B();
parent['a'] === B.prototype['a'] && B.prototype.hasOwnProperty('a') // => false

هذا ليس سيئًا للغاية ، إنه يحتاج فقط إلى التوثيق ، ولكن من المحتمل أن يفاجئ عددًا غير قليل من الأشخاص.

ال 3 كومينتر

تتمثل إحدى المشكلات المحتملة في أن المستخدمين يتوقعون أن إضافة B إلى النماذج الأولية المسموح بها سيعمل في هذه الحالة:

class A { get a() { return 'a' } }
class B extends A {}

const parent = new B();
parent['a'] === B.prototype['a'] && B.prototype.hasOwnProperty('a') // => false

هذا ليس سيئًا للغاية ، إنه يحتاج فقط إلى التوثيق ، ولكن من المحتمل أن يفاجئ عددًا غير قليل من الأشخاص.

يمكننا أيضًا التحقق مما إذا كانت الفئات الفائقة مدرجة في القائمة البيضاء ، لذلك ما عليك سوى إضافة "أ" إلى القائمة البيضاء للحصول على الخصائص من "أ" و "ب" مقبولة.

الطريقة الأخرى أكثر صعوبة ، لأنها تتطلب إدراج جميع الفئات الأصلية في القائمة السوداء ، والتي قد تتغير بمرور الوقت.

nknapp هل من الممكن استخدام getPrototypeOf و getOwnPropertyDescriptor لمعرفة ما إذا كان قد تم تعريف getter. لست متأكدًا مما إذا كان هذا يتراجع إلى المشكلات التي تم إصلاحها بالفعل أم لا.

class Example {
  get hello() {
    return 'world';
  }
}

const obj = new Example();
console.log(obj.hello);
// "world"
console.log(Object.getOwnPropertyDescriptor(obj, 'hello'));
// undefined
console.log(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(obj), 'hello'));
// { configurable: true, enumerable: false, get: function get hello() { return 'world'; }, set: undefined }

المصدر: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get#get_Vs._defineProperty

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات