在 JavaScript 中,对象的属性可以分为“显示属性”(也称为自有属性,own properties)和“隐式属性”(通常指的是继承自原型链上的属性)。理解这两类属性的区别对于深入掌握 JavaScript 对象模型非常重要。
显示属性(Own Properties)
显示属性是指直接定义在一个对象上的属性。它们是该对象自身的一部分,并不通过原型链继承而来。可以通过以下方法来检测或获取一个对象的显示属性:
-
Object.hasOwn(obj, prop)
:这是一个较新的方法,用于检查对象是否具有指定的显示属性。它比obj.hasOwnProperty(prop)
更加安全,因为它不会被原型链上的同名方法覆盖。 -
Object.getOwnPropertyNames(obj)
:返回一个数组,包含对象的所有可枚举和不可枚举的显示属性名称。 -
Object.keys(obj)
:返回一个数组,包含对象所有可枚举的显示属性名称。 -
Object.values(obj)
:返回一个数组,包含对象所有可枚举的显示属性值。
隐式属性(Inherited Properties)
隐式属性是指那些不是直接定义在对象上,而是通过原型链从其构造函数或其他对象继承来的属性。你可以通过以下方式与这些属性交互:
-
for...in
循环:遍历对象的所有可枚举属性,包括自身的和从原型链继承来的属性。 -
Object.getPrototypeOf(obj)
:获取对象的原型(即直接父对象),然后可以进一步检查原型上的属性。 -
instanceof
运算符:检查一个对象是否是某个构造函数的实例,间接反映了对象可能从其原型继承的属性。
示例代码
这里有一个简单的例子,演示了如何区分显示属性和隐式属性:
const parent = { inherited: 'I am from parent' };
const child = Object.create(parent); // 创建一个以 parent 为原型的新对象
child.own = 'I am an own property';
console.log(Object.hasOwn(child, 'own')); // true
console.log(Object.hasOwn(child, 'inherited')); // false
// 使用 for...in 可以访问到继承来的属性
for (let key in child) {
console.log(key + ': ' + child[key]);
}
// 输出:
// own: I am an own property
// inherited: I am from parent
在这个例子中,own
是 child
的显示属性,而 inherited
是通过原型链从 parent
继承来的隐式属性。
理解显示属性和隐式属性的概念有助于更好地控制对象的行为和特性,特别是在涉及原型链、属性枚举以及对象间的关系时。
我的理解是挂在this下的属性属于显示属性,挂在prototype下的也是显示属性,挂在原型链__proto__是隐式属性。