簡體   English   中英

從超類訪問子類中定義的靜態(類)變量

[英]accessing static (class) variables defined in a subclass from a superclass

我有一些共享相同方法的類,並且僅通過幾個靜態(aka類)變量來區分。 我的想法是將通用方法放入訪問靜態變量的基類中。

這是一個可行的解決方案,但似乎是真正的咳嗽咳嗽葯 有沒有更好/更慣用的方式來做到這一點?

"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

是否有特殊原因將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";

上面的代碼通過了您的測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM