【问题标题】:Is there a way to display all new object's properties?有没有办法显示所有新对象的属性?
【发布时间】:2026-01-03 05:00:01
【问题描述】:

假设我有这个代码:

 x = "abcde";
 y = new String(x);

当我console.log(y) 它只返回以下内容: String {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", length: 5, [[PrimitiveValue]]: "abcde"}

但我仍然可以说 y.charAt(0); 并且它会返回 "a" 那么这个 charAt 方法隐藏在哪里?以及如何在 console.log 中看到它?

【问题讨论】:

  • 你没有注意到控制台中的__proto__吗?
  • 您可以使用 for-in 循环来命中控制台隐藏的所有继承属性。
  • @saptal console.log(y.__proto__); 返回String {length: 0, [[PrimitiveValue]]: ""}

标签: javascript object console.log


【解决方案1】:

yString.prototype 获取charAt,在许多浏览器中,您会在控制台中看到__proto__。在控制台中,如果存在,您可能可以展开 __proto__ 以查看 String.prototype 属性(然后展开 __proto__ 以查看 Object.prototype 属性)。

__proto__ 属性在 ES6 中被添加到 JavaScript,但它可能不存在于对象上,因为它来自 Object.prototype,并且对象可能 notObject.prototype 支持(直接或间接)(见下文,栏下方)。

如果你想在代码中访问这些属性——包括你在控制台中用来检查对象的代码——你可以使用Object.getPrototypeOf(无论对象是否有__proto__都有效)和Object.getOwnPropertyNames。前者为您提供对象的原型,后者为您提供该对象的所有属性名称(即使它们是不可枚举的)。

所以对于所有属性的完整列表:

function getAllProperties(obj) {
    var props = [];

    while (obj) {
        props.push.apply(props, Object.getOwnPropertyNames(obj));
        obj = Object.getPrototypeOf(obj);
    }

    return props;
}

实例:

var x = "abcde";
var y = new String(x);
snippet.log(getAllProperties(y).join(", "));

function getAllProperties(obj) {
  var props = [];

  while (obj) {
    props.push.apply(props, Object.getOwnPropertyNames(obj));
    obj = Object.getPrototypeOf(obj);
  }

  return props;
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

一个对象如何直接或间接地得到Object.prototype 的支持,但仍然有原型?像这样:

var p = Object.create(null);   // p has no prototype
var o = Object.create(p);      // o has p as a prototype
console.log("__proto__" in o); // false, __proto__ comes from Object.prototype, 
                               // which isn't in o's prototype chain

【讨论】:

    【解决方案2】:

    你可以在控制台中找到它

    【讨论】:

      最近更新 更多