【问题标题】:Inheriting static properties in Javascript在 Javascript 中继承静态属性
【发布时间】:2020-01-25 19:20:23
【问题描述】:

我在当前项目中使用的设计模式是:

var MyConstructor = function() { ... };
MyConstructor.STATIC_PROPERTY = 'static';

现在,如果我想从 MyConstructor 类继承,我会这样做:

var ChildClass = function() { ... };
ChildClass.prototype = new MyConstructor(); // Or Object.create(...)
ChildClass.prototype.constructor = ChildClass;

问题是ChildClass.STATIC_PROPERTY 未定义/未继承...

有没有办法解决这个问题?

第二个问题:

如果我console.log(MyConstructor),我会得到function() { ...},而MyConstructor.STATIC_PROPERTY 实际存在时则一无所获。 STATIC_PROPERTY 到底存储在哪里?如何查看/显示它?

【问题讨论】:

  • “静态”属性只是构造函数对象的属性。它们与 JavaScript 继承方案没有任何关系。
  • 尝试console.dir(MyConstructor)查看静态属性。
  • 由于您可以在定义ChildClass 的范围内访问MyConstructor(),因此ChildClass.STATIC_PROPERTY = MyConstructor.STATIC_PROPERTY 之类的东西应该可以工作。 (但可能不是可取的)如前所述,它与原型继承无关。不使用Object.defineProperty() 或者它的替代品,它是静态的。我们可以随心所欲地覆盖它。
  • "Or Object.create(...)" - it's not exactly optional

标签: javascript class inheritance properties static


【解决方案1】:

使用 ES6 class,它在原型上确实继承自父类(构造函数对象):

function MyConstructor() { /* … */ }
MyConstructor.STATIC_PROPERTY = 'static';

class ChildClass extends MyConstructor { /* … */ }
console.log(ChildClass.STATIC_PROPERTY);

替代方法是复制所有属性(例如使用Object.assign)或在ChildClass 上使用Object.setPrototypeOf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 2016-10-10
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2012-06-21
    相关资源
    最近更新 更多