You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

包含大字符串的对象属性无法直接访问的异常问题

问题分析与解决方案

1. 异步时序错误(最可能原因)

你代码里用了await但直接调用subscribe,这是典型错误——subscribe返回的是订阅对象而非Promise,await根本不会等待回调里的赋值完成。虽然控制台打印整个对象时能看到original属性,但控制台的对象是实时引用快照,展开时才会读取最新值,实际调用findAndChangeAsset时,赋值可能还没执行完。

修复代码:

把Observable转成Promise再await,Angular旧版本用toPromise():

const content = await this.http.get(assetPath, {responseType: 'text'}).toPromise();
dynamicAsset.original = content;
this.findAndChangeAsset(dynamicAsset);

Angular 12+建议用firstValueFrom:

import { firstValueFrom } from 'rxjs';

// ...

const content = await firstValueFrom(this.http.get(assetPath, {responseType: 'text'}));
dynamicAsset.original = content;
this.findAndChangeAsset(dynamicAsset);

2. 属性不可枚举

如果dynamicAsset是被冻结/密封的对象,或者original属性是通过Object.defineProperty添加的不可枚举属性,就会出现“打印能看到但访问不到”的情况。

验证方法:

赋值后打印属性描述:

console.log(Object.getOwnPropertyDescriptor(dynamicAsset, 'original'));

如果输出里enumerable是false,就是这个问题。

修复方式:

重新定义可枚举属性:

Object.defineProperty(dynamicAsset, 'original', {
  value: content,
  writable: true,
  enumerable: true,
  configurable: true
});

3. 原型链冲突

如果dynamicAsset的原型上有一个名为original的getter方法,且返回undefined,直接访问foundAsset.original会优先取原型上的属性,而非你赋值的实例属性。

验证方法:

检查属性是否属于实例:

console.log(dynamicAsset.hasOwnProperty('original'));

如果返回false,说明属性不在实例上。

修复方式:

用Object.assign强制在实例上添加属性:

Object.assign(dynamicAsset, { original: content });

内容的提问来源于stack exchange,提问作者Itzik Gili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:20:28