請問一下為何在constructor 裡initiate 了this.type , 但在
typeAppendCell call THIS.getType() 之後 THIS.type 是undefined.....
剛才找到是因為在constructor 裡init, 所以要在class 外面create chartAction 的object, 但這樣到處都是不同的object,
var caobj1 = new ChartAction();
caobj1.typeAppendCell()
var caobj2 = new ChartAction();
caobj2.typeAppendCell()
var caobj3 = new ChartAction();
caobj3.typeAppendCell()
這樣的另外一個寫法大家覺得怎樣
console.log((new chartAction()).type);
有沒有更好的寫法.謝謝
class chartAction {
constructor() {
this.type = ['rf3', 'spd', 'dir', 'tc2', 'td2', 'rh2', 'slp', 'hcld', 'mcld', 'lcld', 'ki', 'cape', 'lgt', 'srh', 'dp972', 'dps'];
}
static getType() {
return this.type;
}
static typeAppendCell(cellType="") {
let THIS = this
var idtype = "";
console.log(THIS.getType())
if(cellType != "") {
console.log(cellType)
idtype = cellType;
} else {
console.log(THIS.type)
idtype = THIS.type;
}
for ( var t = 0; t < idtype.length; t++){
if ( false ) {
THIS.svgheight = THIS.svgheight_small;
} else {
THIS.svgheight = THIS.svgheight_large;
}
d3.select("#div_" + idtype[t]).append("div")
.attr("class", idtype[t] + " ccell")
.attr("id", idtype[t])
.attr("width", THIS.svgwidth)
.attr("height", THIS.svgheight)
.attr("display", "inline-table")
//console.log(THIS.type[t])
d3.select('#' + idtype[t])
.append("svg")
.attr("width", THIS.svgwidth)
.attr("height", THIS.svgheight)
.attr("class", "psvg div_cell_wrap")
.attr("id", "psvg" + t)
ccobj.addCloseBtn(idtype[t])
ccobj.addMinimizeBtn(idtype[t])
}
}
}
我本意只是到處方便只用class就能call, 不用到處init 更多的object會做成混亂
這樣的話,與其用class + status,不如直接用object來匯集方法。像這樣
const Utils = {
config: {},
setConfig: function(config) {
this.config = config;
},
tool1: function(param) {
if(config.set1) return param;
return false;
}
}
Utils.tool1('done');
另外,其實可以用module來整理程式架構,並不是一定需要class的。而且class其實只是一個語法糖。javascript的class是協助你寫程式用的,底層還是原本的prototype based inheritance的東西。
如果這是你要的
就參考拿去改
重點:不用 new object,連一次都不用
class Triple {
static triple(n) {
n = n || 1; //should not be a bitwise operation
return n * 3;
}
}
class BiggerTriple extends Triple {
static triple(n) {
return super.triple(n) * super.triple(n);
}
}
console.log(Triple.triple()); // 3
console.log(Triple.triple(6)); // 18
console.log(BiggerTriple.triple(3)); // 81
var tp = new Triple();
console.log(tp.triple()); // 'tp.triple is not a function'.
之前的問題如果解決了的話
就選個最佳解答
開始的時候我打算在class attribute 用static, 因為全都是class裡面用的,
class chartAction {
static def_station =
[
'[30 HK Grids] ',
'[WGL] ',
'[WGL] ',
'[SE] ',
'[SE] ',
'[SE] ',
'[SE] ',
'[30 HK Grids] ',
'[30 HK Grids] ',
'[30 HK Grids] ',
'[30 HK Grids] ',
'[30 HK Grids] ',
'[Sum of 30 HK Grids] ',
'[30 HK Grids] ',
'',
''
];
static station = def_station;
}
但這樣就出了error,
chartAction.js:170 Uncaught ReferenceError: def_station is not defined
at Function.<static_initializer> (chartAction.js:170)
at chartAction.js:1
到底要怎樣才可以assign 一個static attribute 到另外一個... 謝謝
diu7me 大大看一下我已經回答你了
class跟他的instance是不一樣物件,static方法中的this會指到class而不是他的instance。constructor是在產生instance時執行,裡面的this會指到instance,在裡面要操作static屬性,要透過class。