سؤال

هل هناك سبب لعدم ضبط وظائف الكائن أو حذفها أو ببساطة لا يتم تطبيقها لأي سبب على الإطلاق ليس مقصودًا؟

أنا أحافظ على رمز شخص ما وأمر به عدة مرات. يمكنني استخدام Google Chromes Awesome Debugger وأيضًا Textmate. هذه تساعدني في العثور على أصل الخطأ بسرعة نسبيا.

المشكلة التي لدي الآن هي أن لدي كائن: الأنواع. يحتوي هذا الكائن على ... أنواع. وهذه الأنواع لها وظائف وغيرها من المتغيرات المرتبطة بها.

لسبب ما في منتصف الكود ، تم تمرير هذا النوع بواسطة ملايين المراجع على الأرجح. عندما يتعلق الأمر بجزء معين من أجزاء الكود منه ، يبدو أنه اختفى. نفخة! وقد ذهب..!

أي شخص لديه أدنى فكرة (بخلاف إزالته في مكان آخر في وقت سابق من الكود ، أنا أبحث بالفعل عن ذلك)

مثال

الآن أنا ببساطة أضف الوظائف على الطيران. لا تحبها رغم ذلك ، أشعر بقليل من السيطرة على الكود:

if(identifier.kind.hasOwnProperty('getWarning')) {
    identifier.kind.getWarning = CLEANROOM.types[kind].getWarning;
}
هل كانت مفيدة؟

المحلول

لا ، لن تختفي خصائص الكائنات بشكل غامض دون سبب - على الأقل ، لا تحظر أخطاء التنفيذ ، والتي يجب استبعادها بسهولة من خلال معرفة ما إذا كان نفس الشيء يحدث في IE ، و Chrome ، و Firefox ، والتي لها كل منها (و مختلف جدا) تطبيقات جافا سكريبت.

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

يمكن أن يحدث نفس الشيء إذا كان هناك شيء يصنع نسخة مثل هذا:

dest = {};
for (name in src) {
    value = src[name];
    if (typeof value !== "function") {
        dest[name] = value;
    }
}

على سبيل المثال ، شيء يصنع نسخة من البيانات فقط. يمكن أن يحدث أيضًا بشكل أقل وضوحًا ، إذا كان هناك شيء ما:

function clone(src) {
    dest = {};
    for (name in src) {
        if (src.hasOwnProperty(name)) {
            dest[name] = src[name];
        }
    }
    return dest;
}

هذا يجعل نسخة "ضحلة" من الكائن ، فقط نسخ الخصائص التي وضعتها عليها ، نفسها ، وتجاهل أي خصائص تحصل عليها من النموذج الأولي. معظم (ولكن بأي حال من الأحوال) من الكائنات الخصائص ترث من نماذجها الأولية ينزع أن تكون وظائف ، وبالتالي يمكن أن تكون نتيجة ذلك نسخة بيانات فقط. مثال:

function Thingy() {
}
Thingy.prototype.foo = function() {
}
var t = new Thingy();
t.bar = 42;
// `t` has a `foo` function bound to it, indirectly through its prototype,
// and a `bar` property with the value 42
var x = clone(t);
// `x` does *not* have a `foo` function, but it does have a `bar` property,

بالطبع ، يمكنك أيضًا حذف الخصائص من الكائنات التي تشير إلى الوظائف:

for (name in obj) {
    if (typeof obj[name] === "function" && obj.hasOwnProperty(name)) {
        delete obj[name];
    }
}

لكن مرة أخرى ، هذا ليس ضمنيًا ، هذا واضح. ولكن إذا كانت مخفية في وظيفة العمال في مكان ما ، فسيكون من السهل تفويته.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top