ES6构造函数返回基类的实例
ES6 constructor returns instance of base class?
派生类的构造函数返回基类的一个实例。
以下代码解释了我的问题:
// 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
这怎么可能?
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
为了解决这个问题,您可能需要使用每实例破解,比如将TestB.prototype
的所有方法复制到实例上。理想情况下,与其进行黑客攻击,不如尝试通过聚合(也称为"组合",例如,通过将Vector
实例作为类实例的属性)而不是继承来使用Vector
,因为它不是为继承而设置的。
我不知道这个问题的确切原因,但黑客proto解决了这个问题。:)
class TestB extends Vector {
constructor() {
super();
this.__proto__ = TestB.prototype;
}
Log() {
console.log("" + this);
}
}
相关文章:
- ES6构造函数返回基类的实例
- 如何通过Prototype或jquery移除子类的父类基类
- 如何在Javascript中检查实例的类
- 需要帮助理解如何在javascript中定义静态类和可实例化类
- 是受(GWT)基类中方法数量影响的JavaScript对象的大小
- 用javascript动态实例化类
- Javascript继承的问题&基类原型
- Typescript模块和systemjs.从内联脚本实例化类
- 如何从json函数访问javascript中的基类变量
- ExtJS4 - 从单个基类扩展不同的组件
- 从继承的实例创建 JavaScript 基类对象
- Javascript子类对象不保留基类的属性/方法
- Javascript子类化,超级构造函数和使用自定义扩展会丢失基类方法
- 如何在javascript中调用实例化类的函数
- 如何在angularjs中为CRUD做基类概念
- ExtJS:在哪里定义基类的原型扩展
- 在JavaScript中使用原型继承时,如何避免创建基类的实例
- 为什么基类的对象属性与子类的所有实例共享?
- 如何获得一个基类的(多个)实例
- 如何在JavaScript中创建不能被实例化的抽象基类