名称空间和继承:具有JavaScript责任链的超级构造函数
我正在使用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(值、成功者、类型){
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)){
控制台。注销;
})
});
我希望不要太尴尬,但我很困惑
因此,我的问题是:
/**
*克拉斯帕德雷
*/
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是未定义的。如果已经修复,请发布新代码。