Есть ли что-нибудь опасное в создании экземпляра класса додзё, подобного этому? - PullRequest
1 голос
/ 16 ноября 2009

Мне нужно иметь возможность создавать экземпляр объекта класса в Dojo во время выполнения и смешивать его с другим объектом (что-то вроде указания extends или implements в Java, но во время выполнения). и я придумал следующее решение:

var declaredClassBackup = this.declaredClass;  // backup the "declaredClass" 

var mixinObject = null;
try {
    dojo.require(kwArgs.mixinClassName);

    /*
     * Eval the mixinClassName variable to get the Function reference, 
     * then call it as a constructor with our mixinSettings
     */
    mixinObject = new (eval(kwArgs.mixinClassName))(kwArgs.mixinSettings);
} catch (e){
    if(console){
        console.error("%s could not be loaded as a mixin.", 
                kwArgs.mixinClassName);
    }
    mixinObject = new package.path.DefaultMixin(kwArgs.mixinSettings);
}
dojo.mixin(this, mixinObject);

/*
 * Re-set the declaredClass name back to that of this class.
 */
this.declaredClass = declaredClassBackup;

Что может пойти не так с этим типом кода, если что? (Как бы вы сделали его более надежным?) Кроме того, есть ли что-то, что я мог бы просто пропустить в додзё, что сделало бы это для меня более изящно?

1 Ответ

2 голосов
/ 17 ноября 2009

Как минимум две вещи могут пойти не так:

  • Ваш код предполагает, что динамически загружаемый модуль загружается синхронно с dojo.require(). Это верно только для загрузчика по умолчанию. Загрузчик XD будет загружать вещи асинхронно, нарушая вашу логику.
  • Объект создается, а его свойства копируются с использованием dojo.mixin(), что по необходимости сгладит его. Это значит:
    • Это может переопределить некоторые внутренние компоненты (вы сохраняете declaredClass, но могут быть и другие).
    • Помощники ООП (например, this.inherited()) будут повреждены для скопированных методов.

Но если эти ограничения соответствуют вашему варианту использования, с вами все будет в порядке.

Трудно предложить улучшения, потому что неясно, чего вы пытаетесь достичь. Если вы хотите добавить плоские миксины к объекту, единственное, что вам нужно, это убедиться, что объекты действительно плоские.

Незначительные улучшения вашего кода:

  • declaredClass определяется на прототипе объекта, а не на самом объекте & rArr; Вам не нужно сохранять это. Просто удалите его из самого объекта:

    //var declaredClassBackup = this.declaredClass;  // backup the "declaredClass"
    // no need
    // the rest of your code
    ...
    /*
     * Re-set the declaredClass name back to that of this class.
     */
    //this.declaredClass = declaredClassBackup;
    // no need
    delete this.declaredClass;
    
  • Вместо dojo.mixin() вы можете использовать dojo.safeMixin(), который пропускает constructor и украшает методы. Этот метод доступен начиная с версии Dojo 1.4 (включая текущую магистраль).

...