سؤال

وكنت ترغب في الحصول على على اسم متغير من الدرجة.

var Poop = new Class({ 
    getClassName: function() { 
        return arguments.callee._owner.name;
    } 
});
var a = new Poop();
a.getClassName(); //want 'Poop'

وأنا جعل التي سيتم تنفيذها في الفئات الأخرى، وأود أن بناء استعلام SQL الذي يستخدم اسم الفئة (بصيغة الجمع) للجدول.

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

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

المحلول

وجدت الحل. تجزئة لديه وظيفة keyOf ، والتي سوف تعطيني اسم المتغير الذي يحمل قيمة. لذلك جعل تجزئة من النافذة، ثم طلب مفتاح منشئ الفئة.

var Poop = new Class({
    name: function() {
        var w = $H(window);
        return w.keyOf(this.constructor);
    }
});
var a = new Poop();
a.name(); // returns 'Poop'

وهذا بالطبع لا تعمل إلا لأنني إنشاء الفئات في مساحة النافذة العالمية (كما هو شائع مع موتولز). إذا أجريت الطبقات داخل بعض مساحة الاسم، ثم كنت بحاجة فقط لالتجزئة التي مساحة الاسم بدلا من ذلك.

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

نصائح أخرى

وأنا واجهت مشكلة مع تمدد، ولكن وجدت طريقة من حوله:

var getClassNameFromKeys = function (obj, instance) {
        var i = 0, keys = Object.keys(obj);
        for (i; i < keys.length; i++) {
        if ('Ext' !== keys[i] && typeOf(obj[keys[i]]) === 'class' && instance instanceof obj[keys[i]]) {
                return keys[i];
            }
        }
    },
    Ext = new Class(),
    WhatsMyName = new Class({
        Extends: Ext
    }),
    whatsMyNameInstance = new WhatsMyName(),
    cName = getClassNameFromKeys(this, whatsMyNameInstance);

console.log(cName);

ويمكنك تجنب الاختيار على اسم تمتد إذا كنت تتبع نمطا شيئا من هذا القبيل:

var O = {},
    whatsMyNameInstance;

(function () {
    var SUBCLASS_KEYS;

    O.Ext = new Class({
        _className: null,
        getClassName: function () {
            var i = 0;

            SUBCLASS_KEYS = SUBCLASS_KEYS || Object.keys(O.subclasses);

            for (i; i < SUBCLASS_KEYS.length; i++) {
            if (this instanceof O.subclasses[SUBCLASS_KEYS[i]]) {
                    return SUBCLASS_KEYS[i];
                }
        }
        }        
    });
})();

O.subclasses = {};

O.subclasses.WhatsMyName = new Class({
    Extends: O.Ext
});

whatsMyNameInstance = new O.subclasses.WhatsMyName();

whatsMyNameInstance.getClassName();

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

if (a.constructor == Poop) {
     alert("This will work, but I don't really want any Poop.");
}

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

إذا تحقق من جافا سكريبت، دليل قاطع أو الصفحة 174، الفصل 9.7، وليس هناك مناقشة لطيفة على ذلك هناك. في الأساس التوصية لتجميع فئات مخصصة الخاص بك مع خاصية classname، وتجاوز أسلوب القاعدة الافتراضية الطبقة كائن toString() للتحقق هذه الخاصية عند كنت تتصل على فئة مخصصة.

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