تكرار فوق جميع أعضاء كائن ضمن وظيفة هذا الكائن

StackOverflow https://stackoverflow.com/questions/1115269

  •  12-09-2019
  •  | 
  •  

سؤال

سيكون من المفيد للغاية إذا كان بإمكاني القيام بذلك:

var MyObject = function(param1, param2, ... paramN)
{
    this.var1 = stuff;
    this.var2 = moreStuff;
    .
    .
    .
    this.varN = nStuff;

    this.validate = function()
    {
        for(var current in this)
        {
            alert(current);
            //validate all member variables (even this function I suppose)
        }
    };
};

هذا لا يبدو للقيام بما أود. أدرك أن الحلقة سيتعين عليها في نهاية المطاف حلقة من وظيفة الوالدين (والتي أيضا، وليس من المستغرب أن تحدث).

هل هذا مستحيل لأن "هذا" الوظيفة الثانية يشير إلى الوظيفة الثانية وليس الأول؟ أو هي الكلمات الرئيسية "هذا" فقط مشغل الإعلان لعضو عام وليس مرجعا إلى الكائن الخارجي؟

أبلغ الحصول على ما أريده بهذه الطريقة غير ممكن ولكن هناك طريقة أخرى يمكنني أن أذهب حول تحقيق هذا السلوك؟

هل كانت مفيدة؟

المحلول

أعتقد أنك تحاول الحصول على قيمة العضو وتذهب حولها بطريقة خاطئة حتى تجرب هذا:

      var MyObject = function() {
        this.var1 = 'var 1 value';
        this.var2 = 'var 2 value';
        this.varN = 'var n value';
        var self = this;

        this.validate = function() {
          for (var member in self) {
            if (!self.hasOwnProperty(member) || typeof(self[member]) === "function") continue;
            alert(self[member]);
          }
        };
      };

      var m = new MyObject();
      m.validate();

لشرح: حدد الحلقة أولا إذا كانت الخاصية هي خاصية محددة من قبل المستخدم بدلا من الموروثة من كائن الكائن. كما أنه يتحقق من أن العضو ليس وظيفة (مثل التحقق من صحة ()) ثم تنبيهات قيمة العضو.

يوصى بفحص HasOwnProperty من قبل دوغلاس كروكفورد (الأب من JS) كأفضل الممارسات عند التكرار فوق المنزول.

أتمنى أن يساعدك هذا،

داركو

تحرير: نسيت أن أذكر self - أدرجت هذا لأن الطريقة القياسية للتأكد من أن هذا هو في الواقع ما تريده.

نصائح أخرى

كيف تتصل validate?

الكود التالي يعمل بشكل جيد بالنسبة لي:

var MyObject = function(){
    this.var1 = 'stuff';
    this.var2 = 'moreStuff';
    this.varN = 'Stuff';

    this.validate = function()
    {
        for(var current in this)
        {
            alert(current);
        }
    };
};

var m = new MyObject();
m.validate();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top