正确的Javascript继承

我想知道是否可以在 javascript中继承构造函数.在下面的例子中,我希望Moveable能够将x和y参数分配给this.x和this.y,就像我在Sprite中定义的那样.此外,在没有创建祖先的情况下定义原型的最佳方式(但仍然简短且可读)是什么?最好将它分配给类本身,而不是像现在这样在外部范围中分配:
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();

解决方法

调用超类构造函数的标准方法是使用 Function.call
function Moveable(x,y) {
  Sprite.call(this,x,y);
}

至于原型,你可以做这样的事情来链接原型而不创建超类的实例:

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

Moveable.prototype = makePrototype(Sprite);

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

这不是你所要求的“简短和可读”,但唯一的另一种选择是完全跳过原型并直接在构造函数中分配成员.

编辑:正如@Raynos指出的那样,您还需要设置构造函数属性(认情况下由JavaScript完成,但一旦重置Moveable.prototype就会丢失):

Moveable.prototype.constructor = Moveable;

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...