有没有办法显示所有新对象的属性?
Is there a way to display all new object's properties?
假设我有这个代码:
x = "abcde";
y = new String(x);
当我 console.log(y)
它只有 return 以下内容:
String {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", length: 5, [[PrimitiveValue]]: "abcde"}
但我仍然可以说 y.charAt(0);
它会 return "a"
那么这个 charAt
方法隐藏在哪里?以及如何在 console.log?
中看到它
y
从 String.prototype
获取 charAt
,在许多浏览器中,您会在控制台中看到 __proto__
。在控制台中,如果它在那里,您可以展开 __proto__
以查看 String.prototype
属性(然后展开 its __proto__
以查看 Object.prototype
属性).
__proto__
属性 被添加到 ES6 中的 JavaScript,但它可能不存在于对象上,因为它来自 Object.prototype
,并且它是对象 not 可能被 Object.prototype
支持(直接或间接)(见下文,在栏下)。
如果您想在 代码 中访问这些属性——包括您在控制台中用于检查对象的代码——您可以使用 Object.getPrototypeOf
(which works whether the object has __proto__
or not) and Object.getOwnPropertyNames
。前者为您提供对象的原型,后者为您提供该对象的 属性 个名称中的 all(即使它们是不可枚举的)。
因此,对于所有属性的综合列表:
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
您可以通过以下方式在控制台中找到它
假设我有这个代码:
x = "abcde";
y = new String(x);
当我 console.log(y)
它只有 return 以下内容:
String {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", length: 5, [[PrimitiveValue]]: "abcde"}
但我仍然可以说 y.charAt(0);
它会 return "a"
那么这个 charAt
方法隐藏在哪里?以及如何在 console.log?
y
从 String.prototype
获取 charAt
,在许多浏览器中,您会在控制台中看到 __proto__
。在控制台中,如果它在那里,您可以展开 __proto__
以查看 String.prototype
属性(然后展开 its __proto__
以查看 Object.prototype
属性).
__proto__
属性 被添加到 ES6 中的 JavaScript,但它可能不存在于对象上,因为它来自 Object.prototype
,并且它是对象 not 可能被 Object.prototype
支持(直接或间接)(见下文,在栏下)。
如果您想在 代码 中访问这些属性——包括您在控制台中用于检查对象的代码——您可以使用 Object.getPrototypeOf
(which works whether the object has __proto__
or not) and Object.getOwnPropertyNames
。前者为您提供对象的原型,后者为您提供该对象的 属性 个名称中的 all(即使它们是不可枚举的)。
因此,对于所有属性的综合列表:
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
您可以通过以下方式在控制台中找到它