面试题答案
一键面试- 分析修改
protoProp
的情况:- 由于
protoProp
的writable
特性为false
,在Child
实例上尝试修改protoProp
不会生效,它会保持原型对象上protoProp
的初始值。
- 由于
- 分析删除
protoProp
的情况:- 因为
protoProp
的configurable
特性为false
,在Child
实例上尝试删除protoProp
也不会生效,protoProp
仍然存在于原型链上。
- 因为
- 分析通过
for...in
遍历实例的情况:- 由于
protoProp
的enumerable
特性为true
,通过for...in
遍历Child
实例时,protoProp
会被枚举出来。
- 由于
代码示例:
function Parent() {}
Parent.prototype.protoProp = 'parent value';
// 设置属性特性
Object.defineProperty(Parent.prototype, 'protoProp', {
writable: false,
configurable: false,
enumerable: true
});
function Child() {}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
let child = new Child();
// 尝试修改 protoProp
child.protoProp = 'new value';
console.log(child.protoProp); // 输出: parent value
// 尝试删除 protoProp
delete child.protoProp;
console.log('protoProp' in child); // 输出: true
// 通过 for...in 遍历
for (let key in child) {
console.log(key); // 输出: protoProp
}