从超类访问子类中定义的静态(类)变量

时间:2015-09-22 06:25:11

标签: javascript

我有一些共享相同方法的类,只能通过一些静态(aka类)变量来区分。我的想法是将常用方法放入访问静态变量的基类中。

这是一个有效的解决方案,但它似乎是一个真正的咳嗽 kludge。是否有更好/更惯用的方法来做到这一点?

"use strict";

// common code
function Base() { }
Base.prototype.f1 = function() {
    console.log(Object.getPrototypeOf(this).constructor.VAR1); // this feels really really wrong!
}
Base.prototype.f2 = function() {
    console.log(Object.getPrototypeOf(this).constructor.VAR2); // ditto
}

// specialization A
function SubA() {  Base.call(this); }
SubA.prototype = Object.create(Base.prototype);
SubA.prototype.constructor = SubA;
SubA.VAR1 = "suba v1";
SubA.VAR2 = "suba v2";

// specialization B
function SubB() { Base.call(this); }
SubB.prototype = Object.create(Base.prototype);
SubB.prototype.constructor = SubB;
SubB.VAR1 = "subb v1";
SubB.VAR2 = "subb v2";

这可以按预期工作:

> var a = new SubA();
> var b = new SubB();
> a.f1()
suba v1
undefined
> b.f2()
subb v2
undefined

另一种选择

当然,我可以编写方法来封装SubA和SubB之间的差异。语法不那么折磨,但编写基本上像静态变量一样的方法仍然是错误的:

"use strict";

function Base() { }
Base.prototype.f1 = function() {
    console.log(this.getVar1());
}
Base.prototype.f2 = function() {
    console.log(this.getVar2());
}

function SubA() {  Base.call(this); }
SubA.prototype = Object.create(Base.prototype);
SubA.prototype.constructor = SubA;
SubA.prototype.getVar1 = function() { return 'suba v1'; }
SubA.prototype.getVar2 = function() { return 'suba v2'; }

function SubB() { Base.call(this); }
SubB.prototype = Object.create(Base.prototype);
SubB.prototype.constructor = SubB;
SubB.prototype.getVar1 = function() { return 'subb v1'; }
SubB.prototype.getVar2 = function() { return 'subb v2'; }

> var a = new SubA();
> var b = new SubB();
> a.f1()
suba v1
undefined
> b.f2()
subb v2
undefined

1 个答案:

答案 0 :(得分:0)

有没有特别的理由将VAR1VAR2放在类对象本身而不是原型中?如果没有,事情变得更加简单:

function Base() { }
Base.prototype.f1 = function() {
  console.log(this.VAR1);
};
Base.prototype.f2 = function() {
  console.log(this.VAR2);
};

// specialization A
function SubA() {  Base.call(this); }
SubA.prototype = Object.create(Base.prototype);
SubA.prototype.constructor = SubA;
SubA.prototype.VAR1 = "suba v1";
SubA.prototype.VAR2 = "suba v2";

// specialization B
function SubB() { Base.call(this); }
SubB.prototype = Object.create(Base.prototype);
SubB.prototype.constructor = SubB;
SubB.prototype.VAR1 = "subb v1";
SubB.prototype.VAR2 = "subb v2";

以上代码通过了您的测试。