javascript - 正确的 Javascript 继承

标签 javascript inheritance

我想知道是否可以在 javascript 中继承构造函数。在下面的示例中,我希望 Moveablexy 参数分配给 this.xthis.y 分别是我在 Sprite 中定义的。此外,在不创建祖先安装的情况下定义原型(prototype)的最佳方式(但仍然简短且可读)是什么?最好在类本身中分配它,而不是像我现在这样在外部范围内分配它:

function Sprite(x, y) {
    this.x = x ? x : 0;
    this.y = y ? y : 0;     
    this.getPos = function() {
        return {
            x: this.x,
            y: this.y
        };
    };
}

function Moveable(x, y) {

}
Moveable.prototype = new Sprite();

最佳答案

调用父类(super class)构造函数的标准方法是使用 Function.call :

function Moveable(x, y) {
  Sprite.call(this, x, y);
}

至于原型(prototype),你可以做这样的事情来链接原型(prototype)而不创建父类(super class)的实例:

function makePrototype(superclass) {
  function f() { }
  f.prototype = superclass.prototype;
  return new f();
}

Moveable.prototype = makePrototype(Sprite);

这使用虚拟构造函数创建一个对象,该对象与 Sprite 共享相同的原型(prototype),因为这是 JavaScript 所关心的,Moveable 的实例被认为是 instanceof Sprite.

这并不像您要求的那样“简短易读”,但唯一的其他选择是完全跳过原型(prototype)并直接在构造函数中分配成员。

编辑:正如@Raynos 指出的,您还想设置 constructor 属性(默认情况下由 JavaScript 完成,但一旦您重置 Moveable.prototype):

Moveable.prototype.constructor = Moveable;

关于javascript - 正确的 Javascript 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4985460/

相关文章:

javascript - 向下滚动时隐藏菜单(但仅在 50px 之后)

javascript - 如何使用 Angular Material DragAndDrop 设置可拖动元素的默认位置?

javascript - Express js 中的闭包令人困惑

java - 为什么我们不能在子类中分配较弱的特权

Java 泛型 : compatible service subclass

c++ - 具有相同纯虚函数的两个基类

javascript - 使用 Javascript 将多个元素的文本值复制到用户剪贴板

javascript - 为所有内容添加一个外部 js 文件?

c++ - 用于继承和构造函数的未解析的外部符号 c++

c++ - 引用微分函数