【问题标题】:melonJS unclear on use of "this" and constructor callingmelonJS 不清楚“this”的使用和构造函数调用
【发布时间】:2014-03-14 01:53:18
【问题描述】:

我正在关注这个melon JS tutorial,并且正在参与第 3 部分。

我不清楚这段代码 sn-p 中的几件事

game.PlayerEntity = me.ObjectEntity.extend({

    init: function(x, y, settings) {
        this.parent(x, y, settings);
        ... more code here       
    },

首先,您在我的“游戏”对象中创建了一个名为“PlayerEntity”的新成员,它扩展了 melonJS(我)对象实体类。我明白了。不过没看懂

1) this 是指“游戏”对象吗?

2) 如果是这样,那么this.parent 将指代“游戏”的父级——这只是它继承自的 ObjectEntity 类吗?

3) 为什么我不能从game 对象之外调用它?这是说它没有方法init,即使我在game.PlayerEntity {} 对象中定义了一个。

game.PlayerEntity.init(1, 2, 3);

4) 如果您使用this.parent(x, y, settings) 调用构造函数,那么在哪里设置x, y, settings 参数?使用 Java,您可以这样调用构造函数:

public Bicycle(int val1, int val2) {
    myVal1 = val1;
    myVal2 = val2;
}

然后创建类的新实例:

Bicycle bike = new Bicycle(1, 2);

因此,创建实例时会调用 Bicycle 的构造函数。

但是有了这个,我不清楚this.parent(x, y, settings); 是如何“调用构造函数”的。

谢谢!

【问题讨论】:

  • 我认为 this 指的是 PlayerEntity 而 this.parent 指的是 ObjectEntity。

标签: javascript prototypal-inheritance melonjs


【解决方案1】:

此约定最初由 John Resig 描述。事实上,它甚至在 melonJS 文档中提到了他。

继承发生是.parent派生发挥作用的地方。基本上发生的事情是this 指的是您当前的对象,在这种情况下是PlayerEntity

extend 不是内置函数,它在幕后做了一些事情——其中之一是修改属性.parent 以引用“超类”。你可以在源代码中看到这一点

Object.extend = function(prop) {
    // _super rename to parent to ease code reading
    var parent = this.prototype;

由于PlayerEntity 本质上扩展了ObjectEntity,所以在这次通话中发生了什么

this.parent(x, y, settings);

ObjectEntity 是用这 3 个参数 (x,y,settings) 调用的,以使用继承构造底层属性和状态。

melonJS源码在github上:https://github.com/melonjs/melonJS/blob/master/src/core.js

【讨论】:

  • 太棒了!谢谢。还有几个问题。 1) x, y, settings 参数在哪里定义? 2)为了保持继承,我不能在PlayerEntity中使用ObjectEntity.apply(this, arguments);吗? 3) init 怎么称呼?我没有在这里找到 init 作为 ObjectEntity 类的成员 melonjs.github.io/docs/me.ObjectEntity.html
猜你喜欢
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多