'constructor' 并没有像它看起来那样做。除了它的非标准性之外,这也是避免使用它的一个很好的理由——坚持使用 instanceof 和原型。
从技术上讲:“构造函数”不是“s”实例的属性,它是“子”原型对象的属性。当您在 Mozilla 中创建“Sub”函数时,您会得到一个新创建的默认 Sub.prototype 对象,它有一个“构造函数”,出于礼貌,它指向 Sub 函数。
但是,您随后用新的 Base() 替换该原型。带有返回 Sub 的链接的原始默认原型丢失;相反,Sub.prototype 是 Base 的一个实例,没有任何覆盖的“构造函数”属性。所以:
new Sub().constructor===
Sub.prototype.constructor===
new Base().constructor===
Base.prototype.constructor===
Base
...一直到您没有更改其原型的最基本对象。
这样做是传统的/更好的吗?
在处理 JavaScript 对象/类时,没有一个约定;每个库的元类系统的行为都略有不同。我还没有看到手动将“构造函数”写入每个派生类,但如果您真的想要真正的构造函数可用,它似乎是一个很好的解决方案;它还将使代码与不给您“构造函数”的浏览器/引擎兼容。
不过,我会考虑给它一个不同的名称,以避免与现有的和行为不同的“构造函数”属性混淆。