在 Chrome 开发人员工具控制台中使用 console.dir 时褪色属性的意义是什么
What is the significance of faded properties when using console.dir in Chrome Developer Tools Console
在 chrome 的控制台中使用 console.dir() 时对象的 属性 稍微褪色是什么意思。
例如,请查看此屏幕截图中的 "top,width,worldVisible,x & y"。
我查看了此处的 API 参考资料 https://developer.chrome.com/devtools/docs/console-api#consoledirobject,但没有成功。
谢谢
我无法在文档中找到任何官方解释,但根据一些测试我有一个很好的猜测,灰色属性是 defaults/set 由 Javascript引擎而不是代码本身。以下是一些示例:
length
数组
var foo = [1,2,3,45,1337];
console.dir(foo);
在控制台中给出:
请注意,索引没有变灰,但 length
和 __proto__
中的所有内容都变灰了。
原型设计
var Person = function() {
this.canTalk = true;
};
Person.prototype.greet = function() {
if (this.canTalk) {
console.log('Hi, I am ' + this.name);
}
};
var Employee = function(name, title) {
Person.call(this);
this.name = name;
this.title = title;
};
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
Employee.prototype.greet = function() {
if (this.canTalk) {
console.log('Hi, I am ' + this.name + ', the ' + this.title);
}
};
var bob = new Employee('Bob', 'Builder');
bob.greet();
console.dir(bob);
在控制台中给出:
这里有很多有趣的东西。 greet
的所有实例都不会变灰。但是 __proto__
到处都是灰色的(可能是因为引擎将其设置为原型)。 Person
中重写的构造函数也显示为灰色,但 Employee
的显式设置构造函数未显示为灰色。
所以我认为这里有一个粗略的模式,即 Chrom(e/ium) 将它认为您不太可能关心的属性显示为灰色,因为它们是继承的或由引擎设置为语言的构造,但它似乎并不完美。 (但谁是,对吧?)另一个有趣的尝试是 F12 并键入 console.dir(window)
。在那里,除了网站的 Javascript.
放入全局 window 命名空间的内容外,几乎所有内容都变灰了。
淡化属性更适合表示不可枚举的属性。如果我们这样做:
var a = {};
Object.defineProperties(a, {
hello: { enumerable: false },
world: { enumerable: true }
});
console.dir(a);
然后我们看到 hello
变淡了,而 world
没有。
在您的代码中,如果您执行 for(prop in obj) { console.log(prop); }
(其中 obj
是您在控制台屏幕截图中向我们展示的任何对象),您将看到只有褪色的属性未被枚举.
你也可以用 Object.getOwnPropertyDescriptor(obj, "worldVisible")
检查这个,它应该 return 一个带有 enumerable: false
属性.
的对象
请注意 属性 名称上的 斜体 表示 属性 值由 getter 函数定义。 (这也会导致该值在函数为 运行 之前显示 (...)
值。)这是与可枚举性完全不同的问题,可枚举性会导致名称褪色。您可以使用斜体 getter 定义的属性,这些属性不是褪色的不可枚举属性,反之亦然。
在 chrome 的控制台中使用 console.dir() 时对象的 属性 稍微褪色是什么意思。
例如,请查看此屏幕截图中的 "top,width,worldVisible,x & y"。
我查看了此处的 API 参考资料 https://developer.chrome.com/devtools/docs/console-api#consoledirobject,但没有成功。
谢谢
我无法在文档中找到任何官方解释,但根据一些测试我有一个很好的猜测,灰色属性是 defaults/set 由 Javascript引擎而不是代码本身。以下是一些示例:
length
数组
var foo = [1,2,3,45,1337];
console.dir(foo);
在控制台中给出:
请注意,索引没有变灰,但 length
和 __proto__
中的所有内容都变灰了。
原型设计
var Person = function() {
this.canTalk = true;
};
Person.prototype.greet = function() {
if (this.canTalk) {
console.log('Hi, I am ' + this.name);
}
};
var Employee = function(name, title) {
Person.call(this);
this.name = name;
this.title = title;
};
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
Employee.prototype.greet = function() {
if (this.canTalk) {
console.log('Hi, I am ' + this.name + ', the ' + this.title);
}
};
var bob = new Employee('Bob', 'Builder');
bob.greet();
console.dir(bob);
在控制台中给出:
这里有很多有趣的东西。 greet
的所有实例都不会变灰。但是 __proto__
到处都是灰色的(可能是因为引擎将其设置为原型)。 Person
中重写的构造函数也显示为灰色,但 Employee
的显式设置构造函数未显示为灰色。
所以我认为这里有一个粗略的模式,即 Chrom(e/ium) 将它认为您不太可能关心的属性显示为灰色,因为它们是继承的或由引擎设置为语言的构造,但它似乎并不完美。 (但谁是,对吧?)另一个有趣的尝试是 F12 并键入 console.dir(window)
。在那里,除了网站的 Javascript.
淡化属性更适合表示不可枚举的属性。如果我们这样做:
var a = {};
Object.defineProperties(a, {
hello: { enumerable: false },
world: { enumerable: true }
});
console.dir(a);
然后我们看到 hello
变淡了,而 world
没有。
在您的代码中,如果您执行 for(prop in obj) { console.log(prop); }
(其中 obj
是您在控制台屏幕截图中向我们展示的任何对象),您将看到只有褪色的属性未被枚举.
你也可以用 Object.getOwnPropertyDescriptor(obj, "worldVisible")
检查这个,它应该 return 一个带有 enumerable: false
属性.
请注意 属性 名称上的 斜体 表示 属性 值由 getter 函数定义。 (这也会导致该值在函数为 运行 之前显示 (...)
值。)这是与可枚举性完全不同的问题,可枚举性会导致名称褪色。您可以使用斜体 getter 定义的属性,这些属性不是褪色的不可枚举属性,反之亦然。