簡體   English   中英

命名空間和繼承:具有JavaScript責任鏈的超級構造函數

[英]Namespaces and inheritance: super constructor with JavaScript chain of responsibility

我正在使用JavaScript處理名稱空間,類,繼承和責任模式鏈,但是它不起作用-我嘗試按照本教程進行操作 ,但是當我嘗試實現名稱空間和超級構造函數時,它不起作用可以,所以我想我丟失了一些東西。

我的類位於不同的文件中,並且使用相同的名稱空間。 我有一個類Constraint.js

var Namespace = Namespace || {};

//parent class
Namespace.Constraint = (function() {

    //How can I do a constructor with the namespace?
    /**
        function Namespace.Constraint(value, succesor, type) {
            this.value = value;
            this.succesor = succesor;
            this.type = type;
            this.noTopic = "UNDEFINED";
        }
    */

    Namespace.Constraint.prototype.handle = function() {
        if (this.has()) {
            return this.succesor.handle();
        }
    }
    Namespace.Constraint.prototype.has = function() {
        return this.type != this.noTopic;
    }
    return Constraint;
})();

第二個是具有繼承性的類,它位於另一個文件StringConstraint.js

 var Namespace = Namespace ||{};

 Namespace.StringConstraint = (function(_super){

     /**Constructor child*/
     /*
     Namespace.StringConstraint = function(value, succesor) {
         _super.call(value, succesor, "string");
         How to call the constructor of the parent?
     }
     */

     Namespace.StringConstraint.prototype.handle = function() {

         if (this.has()) {
            return "type=text";
         }
         else{

            /* Is this the correct way to call a method of the parent? */
            _super.prototype.handle.call(this);
         }
     }

     Namespace.StringConstraint.prototype.has=function(){
        /* this.type is a value of parent class. Is this the correct way
           to call it? Maybe I should use _super.type?

        */
        return this.type === "string";
     }
     return Namespace.StringConstraint;

 })(Namespace.Constraint); //Reference to parent, but is it fine with the namespace?

還有類BuilderConstraint.js

 var Namespace = Namespace ||{};

 Namespace.BuilderConstraint = (function() {
     this.constraints = new Array();

        Namespace.BuilderConstraint.prototype.add = function( constraint ) {
            this.constraints.push(constraint);
        }
        Namespace.BuilderConstraint.prototype.applyConstraint  = function(callback) {
        for (constraint in this.constraints) {

            //How to ensure that class is Constraint?
            //Because I could get object [index], has not a method handle.
            callback(constraint.handle());
        }
    }
 })();

最后是文件app.js ,這是我的Main:

 $(function() {
     var value = "string";
     var builderConstraint = new Namespace.BuilderConstaint();
     var stringConstraint = new Namespace.StringConstraint(value,null);
     builderConstraint.add(stringConstraint);

     builderConstraint.applyConstraint(function(out) {
         console.log(out);
     })
 });

我希望不要太尷尬,但是我很困惑。

因此,我的問題是:

  1. 如何在不同的JavaScript文件中正確使用命名空間?
  2. 如何添加一個類而不覆蓋名稱空間?
  3. 如何編寫帶有名稱空間的類的構造函數?
  4. 如何在子類的構造函數中使用父類的構造函數?
  5. 在命名空間中使用繼承類的正確方法是什么?
  6. 如何在子類中正確使用父級屬性?

這是一個Constraint類(父類):

/**
 *  Clase padre
 */

var XMLFormBuilder  = XMLFormBuilder  || {};

XMLFormBuilder.Constraint= (function()
{
    function Constraint( value, succesor, type ) {
    this.value = value || "UNDEFINED";
    this.succesor = succesor || null;
    this.type = type || "UNDEFINED";
    this.noTopic = "UNDEFINED";
};

Constraint.prototype.handle = function()
{
    if (typeof null != this.succesor ) {
    {
       return this.succesor.handle();
    }
};

Constraint.prototype.has = function()
{
    return this.type != this.noTopic;
};

return Constraint;

})(); // <-- **Here, there is a trouble.**

StringConstraint類(子類):

/**Child class*/
var XMLFormBuilder = XMLFormBuilder || {};

XMLFormBuilder.StringConstraint=(function(_super)
{
    function StringConstraint(value, succesor)
    {
        this.value = value || "UNDEFINED";
        this.succesor = succesor || null;
        _super.call( this.value, this.succesor, "cadena" );

       /**
        * How to I do to use the constructor of class parent in the constructor of class child?
        * Aquí hay un error, porque no se como llamar correctamente al contructor
        * de la clase padre o como lo sugiere el error que _super no esta definido.
        * Cannot call method 'call' of undefined;
       */

    };
    /* Aquí se genera un error si activo la sobreescritura del prototipo:
        Uncaught SyntaxError: Unexpected token ) /entidad/js/Constraint.js:28
        Uncaught TypeError: undefined is not a function StringConstraint.js:16
        Uncaught TypeError: undefined is not a function

        There is a trouble, because I can't overwrite the prototype
    */
    //StringConstraint.prototype = new _super;

    StringConstraint.prototype.handle=function()
    {
        if(this.has())
            return "type='text'";
        else
           return _super.handle();
    };

    StringConstraint.prototype.has = function()
    {
        return this.type === "cadena";
    }

    return StringConstraint;

    })(XMLFormBuilder.Constraint);

這是一個類BuilderConstraint

var XMLFormBuilder = XMLFormBuilder || {};

XMLFormBuilder.BuilderConstraint = (function()
{
    function BuilderConstraint() {
        this.constraints = new Array();
    }
    BuilderConstraint.prototype.add = function(constraint){
        this.constraints.push(constraint);
    }

    BuilderConstraint.prototype.applyContraints = function()
    {
        var out = "";
        /*
            this.constraints.forEach(function(object){
                out += object.handle();
            });
        */

        for (var index in this.constraints) {
            var constraint = this.constraints[index];
            /* Aquí se me presenta un error, ya que no me
            *  reconoce el método handle de los objetos tipo Constraint
            *  que agrege al array
            */
            out+= constraint.handle();
        }
        return out;
    }
    return BuilderConstraint;
})();

這是app.js

$(function()
{
    var value = "cadena";
    var stringConstraint = new XMLFormBuilder.StringConstraint(value);
    var builderConstraint = new XMLFormBuilder.BuilderConstraint();
    builderConstraint.add(stringConstraint);
    console.log(builderConstraint.applyContraints());
});

/**
* This is the summary the problems:
*   Uncaught SyntaxError: Unexpected token ) Constraint.js:28
*   Uncaught TypeError: Cannot call method 'call' of undefined
*/

您可以在此處查看代碼: https : //gist.github.com/cristianchaparroa/f4ace75aeb8cff04181a

您應該執行以下操作:

Namespace.Constraint = (function(){

   // Create a function in the current execution context
   function Constraint( value, succesor, type ){
      this.value = value;
      this.succesor = succesor;
      this.type = type;
      this.noTopic = "UNDEFINED";

  }

  // Assign to the above function's prototype
  Constraint.prototype.handle =function(){
     if( this.has() ){
         return this.succesor.handle();
      }
  }

  Constraint.prototype.has = function(){
     return this.type != this.noTopic;
  }

  // Return the function so it is assigned to Namespace.Constraint
  return Constraint;

})();

在立即調用的函數表達式(IIFE)中,您可以隨意調用函數Constraint,因為該名稱是函數的本地名稱。 返回值是對該函數對象的引用,並被分配給Namespace.Constraint

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM