包含大字符串的对象属性无法直接访问的异常问题
问题分析与解决方案
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
相关产品推荐
相关产品推荐

