ES6构造函数返回基类的实例?

亚瑟

派生类的构造函数返回基类的实例。

以下代码说明了我的问题:

// Vector is defined by an external module (Unreal.js)
class TestB extends Vector {
    constructor() {
        super();
    }
    Log() {
        console.log("" + this);
    }
}
console.log(new TestB() instanceof TestB) // returns false !!! why ??? 
console.log(new TestB() instanceof Vector) // returns true...

class TestA extends Array {
    constructor() {
        super();
    }
    Log() {
        console.log("" + this);
    }
}
console.log(new TestA() instanceof TestA); // returns true, all is good

这怎么可能?

TJ人群

似乎以Vector使其与不兼容的方式实现了class

这是一个Vector可以做到这一点的例子

function Vector() {
  var v = Object.create(Vector.prototype);
  return v;
}

class TestB extends Vector {
  constructor() {
    super();
  }
}

console.log(new TestB() instanceof TestB);  // false
console.log(new TestB() instanceof Vector); // true

这里的关键是由于Vector返回的对象与new创建的对象不同,因此它的类型错误。关于构造函数的一个鲜为人知的事情是,如果它们返回非null对象引用,则结果new Constructor是构造函数返回的对象,而不是new创建的对象

这是针对那些浏览器支持的代码段class

function Vector() {
  var v = Object.create(Vector.prototype);
  return v;
}

class TestB extends Vector {
  constructor() {
    super();
  }
}

console.log(new TestB() instanceof TestB); // false
console.log(new TestB() instanceof Vector); // true

...并为那些浏览器没有的人提供Babel REPL上实时副本

令我惊讶的是,Babel和Chrome都允许我同时使用class Vector并从中返回值constructor我还没有从规范中弄清楚它是否真的有效:

class Vector {
  constructor() {
    var v = Object.create(Vector.prototype);
    return v;
  }
}

class TestB extends Vector {
  constructor() {
    super();
  }
}

console.log(new TestB() instanceof TestB); // false
console.log(new TestB() instanceof Vector); // true

为了解决这个问题,您可能需要使用针对每个实例的hack,例如将所有TestB.prototype方法都复制到实例上。理想情况下,而不是黑客,请尝试Vector通过聚合(也称为“组合”,例如,通过将Vector实例作为类的实例的属性)来使用继承,因为它不是为继承而设置的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ES6类构造函数参数

来自分类Dev

ES6 +实例属性在构造函数外部实例化

来自分类Dev

Javascript 在类构造函数中调用类 (ES6)

来自分类Dev

Firefox ES6,获取类构造函数名称

来自分类Dev

ES6类与构造函数相同吗?

来自分类Dev

ES6类与构造函数相同吗?

来自分类Dev

将此绑定到 es6 类构造函数

来自分类Dev

在es6中是否可以实例化一个类并定义类似于经典构造函数的原型属性?

来自分类Dev

在类和构造函数中访问ES6 / ES7静态类变量

来自分类Dev

在构造函数期间自动在es6中的所有实例方法上调用bind()

来自分类Dev

解释ES6类构造函数和箭头函数的效果

来自分类Dev

ES6和Typescript,不带构造函数的类函数属性

来自分类Dev

检测构造函数(符号)-ES6

来自分类Dev

实例化es6类

来自分类Dev

实例化es6类

来自分类Dev

在类构造函数(ES6)中定义一个const

来自分类Dev

es6类-将布尔值传递给构造函数

来自分类Dev

将带有预定义道具的对象传递给类构造函数es6

来自分类Dev

es6类-将布尔值传递给构造函数

来自分类Dev

如何在javascript es6类构造函数中声明一个对象

来自分类Dev

如何在 ES6 类构造函数中创建和填充二维数组

来自分类Dev

受保护的构造函数,使基类无法实例化

来自分类Dev

从函数创建ES6类

来自分类Dev

存根 es6 类函数依赖

来自分类Dev

从基类成员函数返回派生类的实例

来自分类Dev

子类调用基类构造函数,然后在子类Arduino C ++中使用基类的实例方法

来自分类Dev

在ES6构造函数中更改键的值

来自分类Dev

ES6:无法在调用构造函数中解构

来自分类Dev

“选择新的构造函数”查询返回java.lang.Object而不是构造函数类的实例

Related 相关文章

热门标签

归档