当前位置: 首页 > 面试题库 >

为什么我不使用Child.prototype = Parent.Prototype而不是Child.prototype = new Parent();Java继承?

闻人凯泽
2023-03-14
问题内容

我不理解javascript中的这种行为来继承,我一直都这样定义它:

function GameObject(oImg, x, y) {

    this.x = x;
    this.y = y;
    this.img = oImg;

    this.hit = new Object();
    this.hitBox.x = x;
    this.hitBox.y = y;
    this.hitBox.width = oImg.width;
    this.hitBox.height = oImg.height;

}

Spaceship.prototype = new GameObject();
Spaceship.prototype.constructor = Spaceship;

function Spaceship(){
    console.log("instantiate ship");
    GameObject.apply(this, arguments);
    this.vx = 0;
    this.vy = 0;
    this.speed = 3;
    this.friction = 0.94;
}

但就我而言,这些行:

    this.hitBox.width = oImg.width;
    this.hitBox.height = oImg.height;

当我在Spaceship构造函数中执行console.log(this)时,可以看到 proto
属性设置为Spaceship而不是GameObject,如果删除它们,则将其设置为GameObject。

如果我使用:

 Spaceship.prototype = GameObject.prototype;

我对此没有更多问题。之所以阻止我,是因为我有另一个具有add()方法的对象,并使用以下代码检查GameObject的对象是否插入:

 if(object instanceof GameObject)

我不明白这两行可能会发生什么变化,因此当它们出现时继承会中断,我不确定第二种方式继承是好的。有人可以启发我吗?:)


问题答案:

如果你这样做

Spaceship.prototype = GameObject.prototype;

然后它们都引用同一个对象,因此,您最好将中的所有内容都包含在内GameObject,如果您向中添加了一些内容Spaceship.prototype,则该对象也将添加到其中GameObject.prototype。您可以通过Spaceship.prototype在分配后添加一些内容来轻松对其进行测试。

至于

Spaceship.prototype = new GameObject();

这将调用可能具有不良副作用的构造函数,而您想使用:

Spaceship.prototype = Object.create(GameObject.prototype);

这里使用的Object.create功能归结为:

Object.create = function( proto ) {
    function f(){}
    f.prototype = proto;
    return new f;
};

现代浏览器已经具有该功能。



 类似资料:
  • 配置:Windows8英文操作系统;JDK1.7;日食。 我安装了一个中国人写的软件,GUI是汉字。但是软件用方框显示得很难看。我在网上搜索了一下,找到了一个修复它的方法。在Win8的控制面板中,将“非Unicode程序的语言”设置为“中文”。 什么是Java默认字符集?是Unicode吗?Java缺省字符集如何与程序员交互?例如,如果Java使用Unicode,那么字符串“ABC”不能编码到其他

  • 问题内容: 从log.go(执行日志包): 只是一个函数包装器,为什么我应该用它代替or ? 有实际原因吗? 问题答案: 两件事不同: 通过包日志进行打印对于并发goroutine是安全的(而普通的则不是) 日志可以自动添加计时信息。 因此,这是两件完全不同的事情。log用于记录和格式化。(好吧,log使用相同的动词和标志,但这很方便)。

  • 很多人问了此问题,说bzero已经被posix-2008废弃,为何还使用bzero。选择bzero而不是memset,有2个原因: bzero有2个参数,指针和长度,很明确就是将制定size的内存初始化为0。而memset有3个参数,需要记忆参数的位置,有不少人经常把长度和初始化值搞错。 bzero比memset的可读性要好。memset可以制定初始化的值,实际上绝大多数情况都是0。 一旦新版本g

  • 问题内容: 为什么以下代码不起作用(Python 2.5.2)? 我想创建一个类似的类,但具有不同的功能。显然我的函数永远不会被调用。而是调用原始文件并失败,因为它需要3个参数,而我传入了一个。 这里发生了什么?这是一个线索吗? 谢谢! 问题答案: 关于其他几个答案,这与用C本身实现的日期无关。该方法不做任何事情,因为它们是 不可变的 对象,因此构造函数()应该完成所有工作。您会看到相同的行为将i

  • 问题内容: 我正在阅读Java JDBC规范(版本4),并且遇到了以下语句: DataSource-此接口在JDBC 2.0可选软件包API中引入。它优于DriverManager,因为它允许有关基础数据源的详细信息对应用程序透明 我想了解的是a 和a 之间的区别以及它为什么存在。我的意思是,上面的代码块说关于数据源的详细信息对于应用程序是透明的,但是是否不会在属性文件中外部化数据库属性(例如用户