في ES3، تم تقديم الحذف في 8.6.2.5 و11.4.1، على النحو التالي
هناك بعض المعلومات،
1. سيقوم عامل الحذف في التنفيذ باستدعاء طريقة [[Delete]] داخل المحرك.
2. تم تعريف [[حذف]] في 8.6.2
3. تحتوي السمة المحذوفة على ميزة DontDelete، إذا كان الأمر كذلك، فسيتم إرجاع خطأ مباشرة عند الحذف.
ابحث عن "DontDelete" وستجد الكثير مما لا يمكن حذفه.
1. تنشيط كائن الوسائط للكائن (10.1.6)
انسخ رمز الكود كما يلي:
وظيفة وظيفة () {
حذف الحجج؛
تنبيه (الوسائط)؛
}
وظيفة (1)؛
2. إعلان المتغير (10.2.1)
انسخ رمز الكود كما يلي:
فار أ = 10؛
حذف أ؛
تنبيه (أ)؛ // 10
تم ذكر هذه المقالة في العديد من كتب JS، أي أنه لا يمكن حذف المتغيرات المعلنة باستخدام var.
3. إعلان الوظيفة
انسخ رمز الكود كما يلي:
وظيفة فونك () {}
حذف الوظيفة؛
تنبيه (وظيفة) // رمز الوظيفة
4. سمة طول الوظيفة
انسخ رمز الكود كما يلي:
وظيفة الوظيفة (أ، ب) {}
حذف func.length;
تنبيه (func. length)؛ // 2
5. بعض الثوابت (NaN، Infinity، غير محددة)
انسخ رمز الكود كما يلي:
حذف نان // خطأ
حذف إنفينيتي؛
حذف غير محدد؛ // خطأ
6. النموذج الأولي للمنشئ المدمج
انسخ رمز الكود كما يلي:
حذف Object.prototype؛
حذف الدالة.prototype؛
حذف Array.prototype؛
حذف ExpReg.prototype؛ // خطأ
حذف التاريخ. النموذج الأولي؛
حذف Error.prototype؛
حذف Number.prototype؛
حذف Boolean.prototype؛
حذف String.prototype؛
7. طول المصفوفات والسلاسل
انسخ رمز الكود كما يلي:
var arr = [], str = 'hello';
حذف arr.length؛
حذف طول السلسلة؛
8. خصائص كائن الرياضيات (Math.E، Math.LN10، Math.LN2، Math.LOG2E، Math.LOG10E، Math.PI، Math.SQRT1_2، Math.SQRT2)
انسخ رمز الكود كما يلي:
حذف Math.E؛
...
9. خصائص الكائنات العادية (المصدر، العمومي، تجاهل الحالة، متعدد الأسطر، الفهرس الأخير)
انسخ رمز الكود كما يلي:
فار ريج = /ss/;
حذف reg.source؛
...
يختلف ES5 عن ES3. لا يوجد "DontDelete" في ES5، ولكن تمت إضافة [[قابل للتكوين]] (8.6.1).
إذا كانت القيمة خاطئة، فلا يمكن حذفها. تم وصف النقاط التسع المذكورة أعلاه في ES5 على أنها [[قابلة للتكوين]] خاطئة.
يمكن للأسلوب Object.defineProperty الجديد في ES5 عرض الكائن المحدد القابل للتكوين، على النحو التالي
انسخ رمز الكود كما يلي:
var obj = {name: 'John'};
Object.defineProperty(obj, "key", {
شكلي: كاذبة،
القيمة: "ثابت"
});
حذف obj.name؛ // صحيح
حذف obj.key // خطأ
الكائن obj له اسم ومفتاح. يمكن حذف الاسم، لكن لا يمكن حذف المفتاح.
بالإضافة إلى ذلك، في الوضع الصارم ES5، سيتم طرح استثناء مباشرةً عند حذف كائن تكون قابليته للتكوين خاطئة. يحب
انسخ رمز الكود كما يلي:
"استخدام صارم"؛
حذف Object.prototype؛
خطأ وحدة التحكم في FF هو كما يلي:
بالإضافة إلى بعض الأساليب أو خصائص الكائنات المضمنة التي لا يمكن حذفها، هناك أيضًا كائنات مخصصة لا يمكن حذفها. على سبيل المثال، لا يمكن للحذف حذف كائن يرث خصائص من النموذج الأولي.
انسخ رمز الكود كما يلي:
وظيفة الشخص () {}
Person.prototype.name = 'جون باكوس';
var p = new Person();
حذف ص. الاسم؛
console.log(p.name); // استمرار إخراج جون باكوس
إذا كان هناك اسم على هذا والنموذج الأولي، فبعد الحذف، سيتم عرض النموذج الأولي.
انسخ رمز الكود كما يلي:
وظيفة الشخص () {
this.name = 'جون باكوس';
}
Person.prototype.name = 'جون ريسيج';
var p = new Person();
console.log(p.name); // جون باكوس
حذف ص. الاسم؛
console.log(p.name); // جون ريسيج، من النموذج الأولي
إذا كان عليك حذف الاسم الموجود على النموذج الأولي، فيمكنك ذلك فقط
انسخ رمز الكود كما يلي:
حذف Person.prototype.name
لتلخيص:
1. لا يمكن حذف معظم خصائص وأساليب الكائنات المضمنة (على الرغم من إمكانية حذف بعضها، مثل isNaN وparseInt)
2. لا يمكن حذف الخصائص والأساليب التي يرثها الكائن من النموذج الأولي.
والسبب بسيط جداً أيضاً
1. لا يمكن حذف معظم خصائص وأساليب الكائنات المضمنة لحماية واجهة برمجة التطبيقات الأساسية للغة، وبمجرد حذف واجهات برمجة التطبيقات هذه، تصبح عديمة الفائدة في الأساس. مثل حذف Object.prototype.
2. لا يمكن حذف السمات والأساليب التي يرثها كائن من النموذج الأولي لحماية النموذج الأولي، وإلا "إذا قام كائن من الفئة A بحذف سمة من النموذج الأولي، فستفقد جميع الكائنات الموروثة من A السمة."