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

无法获取/设置原型属性: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);
}

避坑要点

  1. 别给普通对象用prototype属性,只有构造函数/类函数才有这个东西
  2. 访问原型优先用Object.getPrototypeOf(obj),比__proto__更标准可靠
  3. 操作原型前必须判断是否为null,避免传入非对象参数触发错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:27:46