名称空间和继承:具有JavaScript责任链的超级构造函数

名称空间和继承:具有JavaScript责任链的超级构造函数,javascript,class,inheritance,namespaces,chain-of-responsibility,Javascript,Class,Inheritance,Namespaces,Chain Of Responsibility,我正在使用JavaScript处理名称空间、类、继承和模式责任链,但它不起作用——我尝试了以下方法,但当我尝试实现名称空间和超级构造函数时,它不起作用,所以我认为我缺少了一些东西 我的类位于不同的文件中,并且使用相同的名称空间。我有一个类,Constraint.js: var Namespace=Namespace | |{}; //父类 Namespace.Constraint=(函数(){ //如何使用名称空间创建构造函数? /** 函数名称空间.Constraint(值、成功者、类型){

我正在使用JavaScript处理名称空间、类、继承和模式责任链,但它不起作用——我尝试了以下方法,但当我尝试实现名称空间和超级构造函数时,它不起作用,所以我认为我缺少了一些东西

我的类位于不同的文件中,并且使用相同的名称空间。我有一个类,
Constraint.js

var Namespace=Namespace | |{};
//父类
Namespace.Constraint=(函数(){
//如何使用名称空间创建构造函数?
/**
函数名称空间.Constraint(值、成功者、类型){
这个值=值;
this.succesor=succesor;
this.type=type;
this.noTopic=“未定义”;
}
*/
Namespace.Constraint.prototype.handle=函数(){
if(this.has()){
返回此.successor.handle();
}
}
Namespace.Constraint.prototype.has=函数(){
返回this.type!=this.noTopic;
}
回报约束;
})();
下一个是具有继承性的类,它位于另一个文件
StringConstraint.js

var Namespace=Namespace | |{};
Namespace.StringConstraint=(函数(_super){
/**构造函数子级*/
/*
Namespace.StringConstraint=函数(值,成功){
_super.call(值,succesor,“字符串”);
如何调用父级的构造函数?
}
*/
Namespace.StringConstraint.prototype.handle=函数(){
if(this.has()){
返回“type=text”;
}
否则{
/*这是调用父方法的正确方法吗*/
_super.prototype.handle.call(this);
}
}
Namespace.StringConstraint.prototype.has=函数(){
/*this.type是父类的值。这是正确的方法吗
叫它?也许我应该用超级字体?
*/
返回this.type==“string”;
}
返回Namespace.StringConstraint;
})(名称空间.约束)//引用父对象,但名称空间是否合适?
BuilderConstraint.js

var Namespace=Namespace | |{};
Namespace.BuilderConstraint=(函数(){
this.constraints=新数组();
Namespace.BuilderConstraint.prototype.add=函数(约束){
this.constraints.push(约束);
}
Namespace.BuilderConstraint.prototype.applyConstraint=函数(回调){
for(此.constraints中的约束){
//如何确保类是约束的?
//因为我可以获取对象[index],所以它没有方法句柄。
回调(constraint.handle());
}
}
})();
最后是文件
app.js
,这是我的主要内容:

$(函数(){
var value=“string”;
var builderConstraint=new Namespace.builderConstraint();
var stringConstraint=newnamespace.stringConstraint(值,null);
builderConstraint.add(stringConstraint);
builderConstraint.applyConstraint(函数(out)){
控制台。注销;
})
});
我希望不要太尴尬,但我很困惑

因此,我的问题是:

  • 如何在不同的JavaScript文件中正确使用名称空间
  • 如何在不覆盖命名空间的情况下添加类
  • 如何编写具有命名空间的类的构造函数
  • 如何在类中使用类父级的构造函数 类子的构造函数
  • 将继承类与命名空间一起使用的正确方法是什么
  • 如何在子类中正确使用parents属性
  • 这是一个类约束(父类):

    /**
    *克拉斯帕德雷
    */
    var XMLFormBuilder=XMLFormBuilder | |{};
    约束=(函数()
    {
    函数约束(值、成功者、类型){
    this.value=值| |“未定义”;
    this.succesor=succesor | | null;
    this.type=类型| |“未定义”;
    this.noTopic=“未定义”;
    };
    Constraint.prototype.handle=函数()
    {
    if(typeof null!=this.succesor){
    {
    返回此.successor.handle();
    }
    };
    Constraint.prototype.has=函数()
    {
    返回this.type!=this.noTopic;
    };
    回报约束;
    
    })();//你应该做如下事情:

    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)中,您可以随意调用函数约束,因为名称是函数的本地名称。返回值是对该函数对象的引用,并分配给Namespace.Constraint。

    它解决了我的问题,但如何解决新错误
    未捕获类型错误:对象0在
    Builde中没有方法“handle”
    rConstraint.js
    在foreach中,为什么我的约束没有我的方法
    处理
    ?分配给Namespace.BuilderConstraint的RHS上的IIFE没有返回任何内容,因此Namespace.BuilderConstraint是未定义的。如果已经修复,请发布新代码。