سؤال

لقد أدركت أنه يمكنك الحصول على خاصية في كائن ما مثل هذا:

var obj = {

    init:(function(){ alert('loaded');})();

}

أحاول استخدام هذه الطريقة كهيئة للكائن. المشكلة التي أركض فيها هي تمرير إشارة إلى "OBJ" إلى خاصية init. أظن أنه يولد أخطاء لأن OBJ لم يتم بناؤه بالكامل في متصفح حتى الآن. أحاول أن أفعل ما يلي ، لكن دون جدوى. إذا كانت هناك طريقة للقيام بذلك ، أحب أن أعرف كيف.

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(){ obj.prop(); })();
}
هل كانت مفيدة؟

المحلول

إذا كنت ترغب في إنشاء مثيلات متعددة من كائنات مماثلة ، فيجب عليك استخدام وظائف مُنشئ قديمة عادي (تذكر أن تضع خصائص مشتركة في النموذج الأولي!).

إذا كنت ترغب في إنشاء كائن واحد ، ففكر في استخدام مُنشئ مجهول. مثالك يقرأ:

var obj = new (function() {
    this.prop = function() {
        alert('This just ran.');
    }

    // init code goes here:
    this.prop();
});

هذا له فائدة إضافية على الحرفيات الكائنات: يمكن استخدام وظيفة المنشئ كإغلاق على المتغيرات "الخاصة".

لا تفرط في استخدام الحرفيات الكائنات: قد تجعل الأشياء بسيطة بسيطة ، لكن الأشياء المعقدة ستصبح معقدة للغاية.

نصائح أخرى

هذا غير ممكن: OBJ غير موجود حتى يتم تفسير الكتلة بأكملها.

بديل بسيط:

var obj = {

  init: function(){ 
    alert('loaded');
  }

}.init();

لماذا لا تستخدم نموذج Contrutor (في الواقع ، ليس لدي أي فكرة عن اسمه الصحيح):

function Obj() {
    // Initialising code goes here:
    alert( 'Loaded!' );

    // ...

    // Private properties/methods:
    var message = 'hello',
        sayHello = function() {
            alert(message);
        };

    // Public properties/methods:
    this.prop = function() {
        sayHello();
    };

    // Encapsulation:
    this.setMessage = function(newMessage) {
        message = newMessage;
    };
}

الاستخدام:

var instance = new Obj();
instance.setMessage('Boo');
instance.prop();

نعم ، لا يبدو أن OBJ موجود محليًا حتى وقت لاحق. هذا عمل بالنسبة لي مع setTimeout. تم اختباره موافق على IE8 ، FF5 ، Chrome 12 ، Opera v11.5. لست متأكدًا من 50 ميلي ثانية رغم ذلك ، أتصور أن هذا يكفي.

var obj = {
    prop: function() { alert('This just ran.') },
    init: ( function(){ setTimeout(function(){obj.prop()},50) } )()
}

هذا تحديث إلى المثال المقدم من user1575313.

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

رابط إلى JSfiddle. JSfiddle

var obj = {

init: function()
{ 
    alert('loaded'); 

    this.consoleLog(); 

    /* we want to return this to keep object 
    usable after auto init */ 
    return this;
}, 

consoleLog: function() 
{
    console.log(1); 
}

}.init(); 

/* the obj should now be usable outside the auto init */ 
obj.consoleLog();

init بأسلوب يشبه jQuery

(function() {

var $ = function(){
  return new $.fn.init();
};

$.fn = $.prototype = {
  init: function(){ 
    this.prop(); 
  },
  i: 0,
  prop: function(){ 
    alert('This just ran. Count: ' + (++this.i)); 
    return this;
  }
};

$.fn.init.prototype = $.fn;

$().prop().prop();

})();

jsbin.com

أعتقد أنك تريد تجربة شيء مثل هذا:

var obj = {
    prop: function() { alert('This just ran.'); },
    init: function() { obj.prop(); }
}

كائن حرفي reqire أعضاء مفصولة الفاصلة دون انتقائية.

هل تعمل إذا قمت بتمرير "هذا" إلى وظيفة init؟

شيء مثل: (لم يخبر)

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(o){ o.prop(); })(this);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top