Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:使用子类更改默认函数?_Javascript_Inheritance_Subclass - Fatal编程技术网

JavaScript:使用子类更改默认函数?

JavaScript:使用子类更改默认函数?,javascript,inheritance,subclass,Javascript,Inheritance,Subclass,我正在尝试使用JavaScript制作一个简单的游戏。我希望游戏中的每个关卡都有稍微不同的行为。然而,我也想要一些默认行为,因为不是游戏的每一部分都会改变 我想我应该尝试使用子类化和继承,也许使用这样的级别库: “严格使用”; 函数LevelBase(){ this.load=功能(级别){ 如果(级别==1){ 新建级别1(此);//不能这样做=新建级别1(此); } }; this.func=函数(){ 返回123; }; } 功能级别1(游戏){ 这个原型=游戏; this.func=函

我正在尝试使用JavaScript制作一个简单的游戏。我希望游戏中的每个关卡都有稍微不同的行为。然而,我也想要一些默认行为,因为不是游戏的每一部分都会改变

我想我应该尝试使用子类化和继承,也许使用这样的级别库:

“严格使用”;
函数LevelBase(){
this.load=功能(级别){
如果(级别==1){
新建级别1(此);//不能这样做=新建级别1(此);
}
};
this.func=函数(){
返回123;
};
}
功能级别1(游戏){
这个原型=游戏;
this.func=函数(){
返回456;
};
}
var game=新的LevelBase();
游戏加载(1);

console.log(game.func());//如果要打印456
您可以使用
game.func=…
直接重载

“严格使用”;
函数LevelBase(){
this.load=功能(级别){
如果(级别==1){
新级别1(本);
}
};
this.func=函数(){
返回123;
};
}
功能级别1(游戏){
game.func=函数(){
返回456;
};
}
var game=新的LevelBase();
游戏加载(1);
console.log(game.func());//如果打印456
或愿意进行传输,
是一种方便的实现继承的方法,其方式类似于基于类的语言:

class LevelBase {
  load() {
    // ...
  }

  func() {
    return 123;
  }
}

class Level1 extends LevelBase {
  func() {
    return 456;
  }
}

const level = new Level1();
console.log(level.func()); // Prints 456

在我看来,这是最干净的继承方式,它应该表现得很好,因为它转换为JavaScript自然的基于原型的继承。

这里有一种方法可以在IE11或任何其他ES5环境中使用

它依赖于几个实用函数来定义类,它支持单继承和重载。您可以将函数保存在先加载的较小脚本中,或者将其保留在文件的顶部

在我的方法中,最重要的是我喜欢使用任何具有干净代码的解决方案,这是我在JS中使用“适当”类之前想到的

/*
此函数附加一个原型对象
并返回它
它还添加了超级基本属性(&B)
可以用来推断对象来自哪个类(它的构造函数)
e、 g.var obj=新类();
或者在类上使用base来检查它继承自什么。
Class.base=base,如果没有则为Null
obj.super=类;
*/
函数类(c,p){
p、 base=null;
p、 super=c;
c、 原型=p;
返回c;
}
/*
此函数接受基类、构造函数和原型对象
首先迭代基本原型的属性,
我们的新原型上没有的都是复制品
这本质上允许我们通过
在Decentants中重新定义它。
接下来,将创建一个新的构造函数,它首先调用基构造函数
然后是驱动构造函数。
apply()是一个可以应用于函数对象的javascript函数
在本质上,它是说“调用这个函数,就好像你是第一个参数的成员一样
(使用构造函数时将成为新对象的“this”变量)和
使用调用此外部函数时使用的参数”。
另一种解释是
var obj=新nc(10);
->使用一个参数“10”调用nc。
->然后使用相同的参数调用基构造函数,并将“this”设置为新对象
->然后使用相同的参数调用驱动构造函数,并将“this”设置为新对象
*/
_class.extends=函数(b,c,p){
for(b.prototype中的var pr){
如果(!p[pr]){
p[pr]=b.原型[pr];
}
}
函数nc(){
b、 应用(这个,论点);
c、 应用(这个,论点);
}
p、 基数=b;
p、 super=nc;
nc.prototype=p;
返回nc;
}
var BaseClass=\u类(
//基本构造函数
功能(v1、v2){
这1.v1=v1;
这1.v2=v2;
},
//基本原型(用于常量或类函数)
{
printValues:function(){
console.log(
这是1.v1,
这是1.v2
);
}
}
);
var DerrivedClass1=_class.extends(基类,
功能(v1、v2){
},
{
//这里没有定义它,但是这个原型包含来自父级的函数
}
);
var DerrivedClass2=_class.extends(基类,
功能(v1、v2){
},
{
//这使遗传行为过载
printValues:function(){
console.log(
“V1:“+this.V1,
“V2:”+this.V2
);
}
}
);
var obj_1=新衍生类别1(10,20);
var obj_2=新的衍生类别2(30,40);
//这使用了遗传行为
obj_1.printValues();
//这使用重载行为

obj_2.printValues()谢谢,这是我最初所做的,但这种方法的问题是我不知道如何在切换到另一个级别时重置所有更改。例如,如果我更改了game.func以及一系列其他函数,那么在加载另一个关卡时如何将它们全部更改回默认值?新的级别不一定会改变一切,所以我想保留默认值。谢谢。我很想使用类,但如果可能的话,我真的在寻找一种不用传输的方法。它不必使用对象,我只需要一些方法来默认另一个函数。