假设我有这段代码:
x = "abcde";
y = new String(x);
当我 console.log(y)
它只返回以下内容:
字符串 {0:“a”,1:“b”,2:“c”,3:“d”,4:“e”,长度:5,[[PrimitiveValue]]:“abcde”}
但我仍然可以说 y.charAt(0);
并且它会返回 "a"
那么这个 charAt
方法隐藏在哪里?我如何在 console.log 中看到它?
最佳答案
y
从 String.prototype
获取 charAt
,在许多浏览器中您会在控制台中看到它为 __proto__
.在控制台中,如果它在那里,您可以展开 __proto__
以查看 String.prototype
属性(然后展开 its __proto__
查看 Object.prototype
属性)。
__proto__
属性被添加到 ES6 中的 JavaScript 中,但它可能不会出现在对象上,因为它来自 Object.prototype
,并且它可能用于不由 Object.prototype
支持(直接或间接)的对象(见下文,在栏下)。
如果您想在代码中访问这些属性——包括您在控制台中用来检查对象的代码——您可以使用Object.getPrototypeOf
(无论对象是否具有 __proto__
都有效)和 Object.getOwnPropertyNames
.前者为您提供对象的原型(prototype),后者为您提供该对象的所有属性名称(即使它们是不可枚举的)。
因此,对于所有属性的综合列表:
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
支持,但仍然有一个原型(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
关于javascript - 有没有办法显示所有新对象的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30318757/