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

为何Object.getOwnPropertyNames()未列出对象全部属性和方法?

嘿,这个问题其实涉及到JavaScript里原始值和包装对象的区别,还有自有属性 vs 原型属性的核心概念,我来给你讲明白~

为什么.toUpperCase()没被列出来?

你定义的str是字符串原始值(不是String对象),当你尝试访问它的属性或方法时,JavaScript会临时创建一个String包装对象来处理这个访问操作,但这个包装对象用完就会被销毁。

而Object.getOwnPropertyNames()这个方法的作用,是只返回对象自身拥有的属性/方法(也就是直接定义在对象本身上,不是从原型链继承来的成员)。像.toUpperCase()、.indexOf()这些字符串方法,其实是定义在String.prototype(String构造函数的原型对象)上的,属于所有字符串实例共享的原型属性,并不是str这个原始值对应的临时对象的自有属性,所以自然不会被Object.getOwnPropertyNames(str)列出来。

怎么列出这类原型方法?

有两种常用的方式可以获取到这些字符串原型方法:

方法1:直接遍历String.prototype的自有属性

所有字符串的原型方法都挂载在String.prototype上,我们可以直接获取它的自有属性列表:

var str = 'Hello World!';
// 获取String原型上的所有自有属性(包含所有字符串方法)
var stringMethods = Object.getOwnPropertyNames(String.prototype);
console.log(stringMethods);
// 输出结果会包含toUpperCase、indexOf、slice、substring等方法

方法2:从字符串实例的原型链上获取

如果你想针对当前的字符串实例,从它的原型链上拿到继承来的方法,也可以这么做:

var str = 'Hello World!';
// 获取str对应的原型对象(也就是String.prototype)
var strPrototype = Object.getPrototypeOf(str);
// 遍历原型对象的自有属性
var inheritedMethods = Object.getOwnPropertyNames(strPrototype);
console.log(inheritedMethods);

额外补充:同时列出自有属性和原型方法

如果你想一次性拿到字符串的自有属性(比如你之前得到的"0","1","length"等)和所有原型方法,可以把两个数组合并:

var str = 'Hello World!';
var ownProperties = Object.getOwnPropertyNames(str);
var prototypeMethods = Object.getOwnPropertyNames(String.prototype);
var allMembers = [...ownProperties, ...prototypeMethods];
console.log(allMembers);
你的原始代码修改示例

把你的代码改成这样就能看到所有字符串方法了:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Display properties and methods from objects</title>
</head>
<body>
<script type="text/javascript">
    var str= 'Hello World!';
    // 获取String原型上的所有方法
    var listPropertiesMethods = Object.getOwnPropertyNames(String.prototype);
    console.log(listPropertiesMethods);
</script>
</body>
</html>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:15:28