我无法在文档中找到任何官方解释,但我有一个很好的猜测,基于一些测试,灰色属性是 Javascript 引擎而不是代码本身默认/设置的属性。以下是一些示例:
length 在一个数组中
var foo = [1,2,3,45,1337];
console.dir(foo);
在控制台中给出:
请注意,索引没有变灰,但 length 和 __proto__ 中的所有内容都是。
原型设计
来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype#Examples的代码
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 放入全局窗口命名空间的东西。