无法获取/设置原型属性:Reflect.ownKeys触发类型错误排查
解决获取对象及其原型键时的类型错误问题
问题核心原因
普通字面量对象(比如你创建的{ "tester": 10 })根本没有prototype属性,你访问obj.prototype得到的是undefined。而Reflect.ownKeys、Object.setPrototypeOf这些API要求必须传入对象类型参数,传undefined自然触发类型错误。
另外你混淆了两个关键概念:
__proto__:所有对象都自带的属性,指向该对象的原型对象(比如字面量对象的__proto__是Object.prototype)prototype:只有函数对象才有的属性,用来给构造函数的实例设置原型
错误代码拆解
看你写的报错代码,比如这行:
let kp = Reflect.ownKeys(obj.prototype);
obj是普通对象,obj.prototype是undefined,非对象,直接违反了Reflect.ownKeys的参数要求,必报错。
你提到Reflect.ownKeys(obj.__proto__)报错?这不符合正常逻辑——字面量对象的__proto__是Object.prototype,是合法对象,大概率是你测试时的笔误或者环境异常,核心问题还是出在obj.prototype上。
正确实现代码
要安全获取对象自身和原型的键,同时避免报错,代码应该这么写:
let obj = { "tester": 10 }; // 获取对象自身的所有键(包括不可枚举的) const ownKeys = Reflect.ownKeys(obj); console.log('自身键:', ownKeys); // 输出 ["tester"] // 标准方式获取对象原型,替代__proto__ const proto = Object.getPrototypeOf(obj); let protoKeys = []; // 先判断原型是否为null(比如Object.create(null)创建的对象原型就是null) if (proto !== null) { // 获取原型的所有键 protoKeys = Reflect.ownKeys(proto); // 如果只需要可枚举的键,用Object.keys const enumerableProtoKeys = Object.keys(proto); } // 冻结对象及其原型的正确姿势 Object.freeze(obj); if (proto !== null) { Object.freeze(proto); }
避坑要点
- 别给普通对象用
prototype属性,只有构造函数/类函数才有这个东西 - 访问原型优先用
Object.getPrototypeOf(obj),比__proto__更标准可靠 - 操作原型前必须判断是否为
null,避免传入非对象参数触发错误
内容的提问来源于stack exchange,提问作者Gary
相关产品推荐
相关产品推荐

