面试题答案
一键面试代码实现
function MyConstructor() {
// 实例属性
this.instanceProperty = 'This is an instance property';
}
// 原型属性
MyConstructor.prototype.prototypeProperty = 'This is a prototype property';
// 原型方法
MyConstructor.prototype.prototypeMethod = function() {
return 'This is a prototype method';
};
// 创建实例对象
const myInstance = new MyConstructor();
交互原理
- 查找过程:当使用点操作符(
.
) 访问myInstance
的属性或方法时,JavaScript 首先在实例对象自身上查找。如果找不到,就会沿着原型链向上查找,直到找到匹配的属性或方法,或者到达原型链的顶端(null
)。 - 确定属性来源:如果在实例对象自身找到了属性,那么该属性就是实例自身的。如果在实例对象自身没有找到,而是在原型上找到的,那么该属性就是原型上的。
- 优先级顺序:实例自身的属性优先级高于原型上的属性。如果存在同名属性,实例属性会覆盖原型属性。
示例说明
// 访问实例属性
console.log(myInstance.instanceProperty);
// 输出: This is an instance property
// 访问原型属性
console.log(myInstance.prototypeProperty);
// 输出: This is a prototype property
// 访问原型方法
console.log(myInstance.prototypeMethod());
// 输出: This is a prototype method
// 在实例上添加同名属性覆盖原型属性
myInstance.prototypeProperty = 'Override prototype property';
console.log(myInstance.prototypeProperty);
// 输出: Override prototype property
// 验证原型上的属性未改变
console.log(MyConstructor.prototype.prototypeProperty);
// 输出: This is a prototype property
通过上述代码和说明,可以清晰看到 myInstance
在访问属性和方法时,JavaScript 操作符与原型链之间的交互原理。