JavaScriptでは、配列の反復処理にネイティブな構文がないため、[].forEach((item)=>{...})
を使用するのが一般的です。
しかし、そのクロージャはthis
の値を変更します。TypeScript: "this" of "parent"関数へのアクセス(JavaのようなMyClass.this)
Javaの場合、そのような場合は、MyClass.this
という構文があり、これは "上位" this
を参照できます。
TypeScriptのようなものがありますか?または計画ですか?私はthis
参照を格納するために蒸散されていると想像することができ、閉鎖でそれを使用します。
コード:
public fromJSON(input: Object, clazz?: typeof FrameModel): T
{
const service_this = this;
if (clazz === void 0){
var disc = input[GraphJSONtoTsModelsService.DISCRIMINATOR];
if (disc instanceof Array)
disc = disc[0];
if (disc === void 0)
throw new Error(`Given object doesn't specify "${GraphJSONtoTsModelsService.DISCRIMINATOR}" and no target class given: ` + JSON.stringify(input));
clazz = this.getTypeScriptClassByDiscriminator(disc);
}
if (clazz == null){
throw new Error(`No class found for discriminator ${disc}: ` + JSON.stringify(input));
}
let result = new FrameModel(input["_id"]);
//result.setVertexId(input["_id"]);
//console.log("We have a frame now: " + result);
//for (let name in Object.getOwnPropertyNames(input)){
let propNames = Object.getOwnPropertyNames(input);
for (let i = 0; i < propNames.length; i++) {
let name = propNames[i];
let val = input[name];
// Properties
if (typeof val === 'string' || typeof val === 'number'){
let beanPropName = clazz.graphPropertyMapping[name] || name; // Use same if not defined.
result[beanPropName] = val;
}
// Adjacent - input prop name is graph edge name.
if (typeof val === 'object'){
let beanPropName = clazz.graphRelationMapping[name] || name; // Use same if not defined.
let info = RelationInfo.parse(beanPropName);
//console.log(`propName: ${name} beanPropName: ${beanPropName} isArray: ${isArray}`);
let direction = val["direction"];
let items = [];
if (val["vertices"] instanceof Array) {
val["vertices"].forEach((vertex) => {
let item: Object;
let mode = vertex[GraphJSONtoTsModelsService.MODE] || "vertex";
if (mode == "vertex")
item = service_this.fromJSON(vertex);
else if (mode == "link")
{
let link: string = vertex["link"];
item = service_this.fromLink(link);
}
//console.log(`item: ${item} vertex: ${JSON.stringify(vertex)}`);
items.push(item);
});
}
result[info.beanPropName] = info.isArray ? items : (items[0]);
}
}
return <T> result;
}
実際、矢印関数は 'this'のコンテキストを保存しません。そして、いいえ、JavaのClass.thisに相当するjs/tsはありません。 –
どこに保存?ラムダ内の 'this'は別のオブジェクトを指し、コンストラクタ' Function'を指します。これはラムダそのものです。 –
コードを追加しました。私はまた、喜んで質問に関係のないヒントを受け入れる;-) –