我看到很多像这样的代码:
function Base() {} function Sub() {} Sub.prototype = new Base();
但是,如果你这样做:
s = new Sub(); print(s.constructor == Sub);
这是错误的.这对我来说似乎很困惑,因为s的构造函数确实是Sub.这样做是常规/更好吗?
function Base() {} function Sub() {} Sub.prototype = new Base(); Sub.prototype.constructor = Sub;
或者它真的不重要吗?
'constructor'不会像它看起来那样做.除了非标准之外,这是避免使用它的一个很好的理由 - 坚持使用instanceof和prototype.
从技术上讲:'constructor'不是's'实例的属性,它是'Sub'原型对象的一个属性.当您在Mozilla中创建"Sub"函数时,您将获得一个新创建的默认Sub.prototype对象,该对象具有指向Sub函数的"构造函数"作为礼貌.
但是,然后用新的Base()替换该原型.返回Sub的原始默认原型丢失了; 相反,Sub.prototype是Base的一个实例,没有任何重写的'constructor'属性.所以:
new Sub().constructor=== Sub.prototype.constructor=== new Base().constructor=== Base.prototype.constructor=== Base
......一直到最基本的物体,你的原型没有改变.
这样做是常规/更好吗?
处理JavaScript对象/类时,没有一个约定; 每个库的元类系统的行为略有不同.我还没有看到一个手动为每个派生类写"构造函数"的人,但是如果你真的想让真正的构造函数可用,它似乎是一个很好的解决方案.它还将使代码与不提供"构造函数"的浏览器/引擎兼容.
不过,我会考虑给它一个不同的名称,以避免与现有的和不同行为的"构造函数"属性混淆.